正则表达式以字符串开头和/或结尾 - 如何简化?

7
我有一个可能以;开头和/或结尾的字符串,我想匹配并替换这些;字符串。以下正则表达式可以工作,但我该如何使它更简单?
(?:^(; ).*)(?:.*(; )$)|(?:^(; ).*)|(?:.*(; )$)

这个结构使用AB|A|B(A和B,或者A,或者B)。

示例字符串:

  • ; foo ;bar;(2个匹配项)
  • foo ;bar;(1个匹配项)
  • ; foo ;bar(1个匹配项)
  • foo ;bar(0个匹配项)

1
外部的非捕获组只会影响可读性。顺便问一下,预期输出是什么?请尝试 ^;\s*|;\s*$ - Wiktor Stribiżew
1
为什么不先处理所有的开始,然后再处理所有的结束,这样你就有了2个独立的情况。 - Dennis Jaheruddin
2个回答

6
请注意,非捕获组旨在分组模式序列,如果您不对组进行量化,也不使用替代方案,则非捕获组变得多余。因此,您的正则表达式将看起来像是^(; ).*.*(; )$|^(; ).*|.*(; )$,没有这些组,您可以轻松看到第一个备选方案中有双重.*。将模式简化为^(; ).*(; )$|^(; ).*|.*(; )$,您可以看到如果第一部分不匹配,第二或第三部分将在开头或结尾找到跟随空格的;,因此第一个备选方案看起来是多余的(除非您需要将替换逻辑拆分为3种情况!)。
因此,如果您只想用1个替换模式替换匹配项,您可以只使用
^;\s*|;\s*$

请查看正则表达式演示

1
完美。谢谢! - Andrew Downes

1

谢谢您。与上面的答案不同,但是这个并没有匹配空格。 - Andrew Downes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接