作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设一个人想要匹配一个任意数字,即前面或后面是某个字符串。但是,如果可能,模式应该总是倾向于匹配数字后跟字符串的子字符串。
例如:
1234 foo
应该匹配。 foo 1234
应该匹配。 1234 foo 1234
应该产生匹配 1234 foo
. foo 1234 foo
应该产生匹配 1234 foo
而不是 foo 1234
. foo 1234
.
(\d+)?(?:(?(1) ?)(foo) ??)(?(1)|(?:(\d+)))
向如下所示的条件添加负面预测也无济于事。字符串
foo 1234 foo
现在产生两个匹配
foo 123
和
4 foo
.
(\d+)?(?:(?(1) ?)(foo) ??)(?(1)|(?:(\d+)(?! ?foo)))
由于正则表达式是贪婪的,它总是首先匹配情况 4 中的非首选子字符串。有没有办法让正则表达式更喜欢后面的匹配条件表达式?
最佳答案
好的,如果你不想重复使用 foo
除非它在前瞻中,否则我相信以下模式将满足您的所有条件:
(\d+)?(?(1) )(foo)(?(1)| (\d+)\b(?! foo))
Demo .
(\d+)? # An optional capturing group matching one or more digits.
(?(1) ) # If the previous group exists, match a space character.
(foo) # A second capturing group to capture "foo".
(? # If...
(1) # ..the first group exists, match nothing.
| # Else...
[ ] # Match a space character.
(\d+) # A third capturing group matching one or more digits.
\b # Assert a word boundary to make sure no more digits following.
(?! foo) # A negative Lookahead to make sure " foo" is not following.
) # End If.
如果数字不必以单词边界结尾,则最后一部分的另一种方法是去掉
\b
并添加
\d*
在负前瞻中:
(\d+)?(?(1) )(foo)(?(1)| (\d+)(?!\d* foo))
Demo .
\d+.?\d*
)。
(\d+)?(?(1) )(foo)(?(1)| (?>(\d+))(?! foo))
Demo
关于regex - 是否可以使用条件正则表达式更喜欢以后的匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64225829/
命令 svn status 返回如下内容: ? SomeClient\BUTCHERED.docx M SomeClient\Development notes.txt ?
我是一名优秀的程序员,十分优秀!