问题描述
我正在尝试从字符串中查找符合特定条件的破折号 -
,并且正则表达式只应选择破折号。
应该选择的情况-
- 如果双方都有空间。示例:
test - dash
- 如果右手边有空间。示例:
test- dash
- 如果双方都没有空间。示例:
test-dash
不应该被选中的情况
- 如果右侧没有空间,但左侧有空间。示例:
test -dash
这是我的进步
如屏幕截图所示,我可以使用 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-])
词边界,匹配-
并在右侧断言除-
之外的非空白字符