条件正则表达式匹配前缀(和 or)后缀,但不能匹配两者都不带的单词

Conditional RegEx to match prefix (and or) suffix but not a word with neither

提问人:stackunderflow 提问时间:4/16/2023 更新时间:4/16/2023 访问量:369

问:

为了防止有人浪费时间提供替代解决方案,我必须使用正则表达式来完成这项任务。

我正在尝试编写一个正则表达式来匹配前缀为“<”(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) 来运行这些正则表达式,我不知道它使用什么正则表达式引擎,但常见的正则表达式命令似乎可以正常工作。

谢谢你,任何帮助将不胜感激。

正则表达式 匹配

评论

0赞 Nir Alfasi 4/16/2023
怎么样: ?<\w+>|<\/\w+>|<\w+\/>
1赞 Wiktor Stribiżew 4/16/2023
请参阅(演示(<)?text(?(1)>?|>))
1赞 stackunderflow 4/16/2023
感谢Barmar、Nir Alfasi和Wiktor Stribiżew的帮助。Wiktor Stribiżew 你已经解决了!非常感谢你,我已经为这个问题苦苦挣扎了一段时间,我希望我能早点在stackoverflow上问。我将研究您的代码,以了解我哪里出了问题,以及您的示例究竟是如何工作的。(\<)?text(?(1)\>?|\>) 这非常有效。再次感谢大家的帮助,我将尝试找出如何在这个论坛上给出积分。
0赞 Cary Swoveland 4/17/2023
如果基本词是,您希望匹配还是?"text""context>""<textbook"

答:

0赞 Barmar 4/16/2023 #1

使用两种替代方法:

<text|text>

这将匹配 或 .它也将匹配,因为它包含 .<texttext><text><text

这假设您只是在测试字符串是否包含匹配项,而不是您尝试返回匹配的部分。在后一种情况下,可以选择将另一个括号添加到以下选项之一:

<text>?|text>

第一个备选方案匹配 或 ,第二个备选方案匹配 。<text<text>text>

评论

0赞 Cary Swoveland 4/16/2023
请参阅我对 stackunderflow 答案的评论。
0赞 Barmar 4/17/2023
从问题中并不清楚这些是要排除的。
0赞 stackunderflow 4/16/2023 #2

我的问题已经得到解答。

Wiktor Stribiżew 的这个正则表达式工作得很好。(\<)?text(?(1)\>?|\>)

谢谢大家。

评论

1赞 Cary Swoveland 4/16/2023
这需要词边界来避免匹配,例如,或 ."textbook""context"
1赞 Cary Swoveland 4/17/2023
由于@Wiktor已提交答案,我建议您删除您的答案。如果你想说明他的解决方案对你有用,你可以在他的回答上添加一个评论。
0赞 Andy A. 4/17/2023
请接受你最喜欢的答案,而不是重复它。所以删除它。
0赞 stackunderflow 4/17/2023
我选择了 Wiktor Stribiżew 最新答案作为最佳答案。我是 stackoverflow 的新用户,所以如果我在声明我的问题已回答时犯了错误,我深表歉意。在 Wiktor Stribiżew 发表评论后不久,我直接回复了他,我也感谢所有做出贡献的人,但人们继续回答我的问题。
0赞 stackunderflow 4/17/2023
对于新用户来说,没有明显的方法可以知道如何将“评论”标记为最佳答案,因此为了防止其他人浪费时间回答我的问题,我认为表明我的问题已得到回答的最佳方式是通过回答发布新帖子, 并归功于 Wiktor Stribiżew。我对正则表达式有一些经验,我知道我的最终正则表达式需要单词边界,但我认为将我的问题简化为让我感到困惑的实际部分是明智的。感谢所有帮助我解决问题的人。
0赞 Wiktor Stribiżew 4/16/2023 #3

你可以使用

(<)?text(?(1)>?|>)

请参阅正则表达式演示

细节

  • (<)?- 组 1(可选):匹配可选<
  • text- 匹配字符串text
  • (?(1)>?|>)- 条件构造:如果组 1 匹配,则匹配可选字符,否则必须匹配 a。>>

如果您需要使用单词边界,请像

(<)?\btext\b(?(1)>?|>)