提问人:stackunderflow 提问时间:4/16/2023 更新时间:4/16/2023 访问量:369
条件正则表达式匹配前缀(和 or)后缀,但不能匹配两者都不带的单词
Conditional RegEx to match prefix (and or) suffix but not a word with neither
问:
为了防止有人浪费时间提供替代解决方案,我必须使用正则表达式来完成这项任务。
我正在尝试编写一个正则表达式来匹配前缀为“<”(AND OR)和后缀“>”的基本词,但如果基本词既没有前缀也没有后缀,则不匹配。
这不是匹配“<”或“>”的简单情况,因为此字符可能会更改或成为组的一部分。
例。
对于这个例子,基本词组是 (base|text|word) 在现实生活中,这个列表可能很长。
在输入文本文件中的这些候选者中...
text
<text
text>
<text>
...我想匹配以下内容...
<text
text>
<text>
...但不匹配...
text
在英语口语中,我的正则表达式正在寻找任何以“<”(AND OR)为后缀的“>”后缀的基本单词,但如果它既没有前缀/后缀,则不匹配基本单词。
如上所述,这不是匹配字面“<”或“>”的情况,因为这些字符可能不同或属于一个组。
在我所做的所有尝试中,如果它在没有前缀或后缀的情况下单独出现,我无法在不捕获基本词的情况下让它工作。
当我在解决这个问题时变得越来越慌张时,我未能保留我以前的所有尝试。我的努力对这里的任何人来说都没有什么价值,因为他们都失败了,当我没有想法时,我最终只能猜测。
以下是一些示例。
(text)
= 这将捕获“文本”
(\<)(text)
= 这将捕获“<文本”
(text)(/>)
= 这将捕获“文本>”
(\<)(text)(/>)
= 这将捕获“<文本>”
(\<|)(text)(|/>)
= 这是最接近的,因为它会捕获“<text”,“text>”,“<text>”,但它也会捕获“text”。
我还尝试过环顾和后视,但我无法向后看并跳过基本词以查看是否有前缀。
唯一的解决方法是使用 2 个正则表达式。第一个寻找,第二个寻找,但是这意味着运行正则表达式两次,这是低效的,我真的很想解决这个问题。(\<)(text)
(text)(/>)
我得到了一个独立的自定义可执行文件 (windows) 来运行这些正则表达式,我不知道它使用什么正则表达式引擎,但常见的正则表达式命令似乎可以正常工作。
谢谢你,任何帮助将不胜感激。
答:
使用两种替代方法:
<text|text>
这将匹配 或 .它也将匹配,因为它包含 .<text
text>
<text>
<text
这假设您只是在测试字符串是否包含匹配项,而不是您尝试返回匹配的部分。在后一种情况下,可以选择将另一个括号添加到以下选项之一:
<text>?|text>
第一个备选方案匹配 或 ,第二个备选方案匹配 。<text
<text>
text>
评论
我的问题已经得到解答。
Wiktor Stribiżew 的这个正则表达式工作得很好。(\<)?text(?(1)\>?|\>)
谢谢大家。
评论
"textbook"
"context"
你可以使用
(<)?text(?(1)>?|>)
请参阅正则表达式演示。
细节:
(<)?
- 组 1(可选):匹配可选<
text
- 匹配字符串text
(?(1)>?|>)
- 条件构造:如果组 1 匹配,则匹配可选字符,否则必须匹配 a。>
>
如果您需要使用单词边界,请像
(<)?\btext\b(?(1)>?|>)
评论
<\w+>|<\/\w+>|<\w+\/>
(<)?text(?(1)>?|>)
)"text"
"context>"
"<textbook"