如果匹配某些条件,如何在正则表达式中选择特定字符

问题描述

我正在尝试从字符串中查找符合特定条件的破折号 -,并且正则表达式只应选择破折号。

应该选择的情况-

  1. 如果双方都有空间。示例:test - dash
  2. 如果右手边有空间。示例:test- dash
  3. 如果双方都没有空间。示例:test-dash

不应该被选中的情况

  1. 如果右侧没有空间,但左侧有空间。示例:test -dash

这是我的进步

enter image description here

如屏幕截图所示,我可以使用 positive-lookbehind 实现,但这并未得到广泛支持

那么,我的问题是,是否有其他方法可以在不使用 positive-lookbehind 的情况下实现这一目标?

谢谢。

解决方法

这应该有效:

\S+( ?)-(\1| )\S+

https://regex101.com/r/XI6W4R/1

它使用第一个捕获组来知道破折号前是否有空格。如果有,那么破折号后面一定有一个空格。否则,破折号后的空格是可选的。

后向引用比正面后视得到更广泛的支持(根据此 Regular Expression Engine Comparison Chart)。


我试图只选择 -。而不是整个事情

在这种情况下,我的知识仅限于提供以下正则表达式的使用

\S+( ?)(-)(\1| )\S+

并使用捕获组 2 来查找破折号。如果不知道使用此正则表达式的确切方式,也很难提供更好的建议。

https://regex101.com/r/XI6W4R/2

,

你可以使用

-(?!(?<=\s-)\S)

参见regex demo

详情

  • - - 连字符
  • (?!(?<=\s-)\S) - 后面没有紧跟一个非空白字符(也就是说,右边必须有一个空格或字符串的结尾),而是紧跟在前面有一个空格和 - 字符。
,

对于示例数据,如果您不能使用lookbehind,也许使用单词边界就足够了。

-(?=\s)|\b-(?=[^\s-])

说明

  • -(?=\s) 匹配 - 并在右侧断言一个空格字符
  • |
  • \b-(?=[^\s-]) 词边界,匹配 - 并在右侧断言除 - 之外的非空白字符

Regex demo