随机字符串中的负先行
Negative Lookahead within a random string
我想过滤以 Model
结尾但不以 ViewModel
结尾的单词。 Model
前面也需要至少2个字符
MyModel // - do match
MyViewModel // - do not match
所以我认为这很容易,这种负面前瞻应该足够好。但
它没有按照我想要的方式工作。它也匹配 ViewModel
。
^[a-z]{2,99}(?!View)Model$
模式 (?!A)B
将始终在 B 上匹配,因为显然您不会同时查看 A 和 B。要检查 B 之前发生了什么,您可以使用(负)后视:
为什么前瞻不起作用?
匹配过程是这样的(没有回溯)
MyView | ^[a-z]{2,99} // Match as much as we can
| (?!View) // No "View" ahead, so we're good
Model | Model // normal match
您可以匹配任何单词字符零次或多次 \w*
后跟 ViewModel
并在组中捕获 2 个或更多单词字符 \w{2,}
后跟 Model
。
通过这种方式,您可以匹配不需要的内容,并在一个组中捕获您想要的内容。
你的比赛在第 1 组中。
详情
\w*
匹配零个或多个单词字符
ViewModel
字面匹配
|
或
(\w{2,}Model)
在一组中捕获 2 个或更多单词字符后跟模型
\b
字边界
并不是所有的正则表达式风格都像 JS 一样支持后视 (?<=...)
/ (?<!...)
(Chrome 到目前为止有支持)。但是您可以使用先行解决此问题:
\b(?!\w*ViewModel\b)\w{2,}Model\b
细分:
\b
匹配单词边界
(?!
负先行开始
\w*ViewModel\b
单词不应以 ViewModel
结尾
)
前瞻结束
\w{2,}Model\b
匹配以 Model
结尾的整个单词
我想过滤以 Model
结尾但不以 ViewModel
结尾的单词。 Model
MyModel // - do match
MyViewModel // - do not match
所以我认为这很容易,这种负面前瞻应该足够好。但
它没有按照我想要的方式工作。它也匹配 ViewModel
。
^[a-z]{2,99}(?!View)Model$
模式 (?!A)B
将始终在 B 上匹配,因为显然您不会同时查看 A 和 B。要检查 B 之前发生了什么,您可以使用(负)后视:
为什么前瞻不起作用?
匹配过程是这样的(没有回溯)
MyView | ^[a-z]{2,99} // Match as much as we can
| (?!View) // No "View" ahead, so we're good
Model | Model // normal match
您可以匹配任何单词字符零次或多次 \w*
后跟 ViewModel
并在组中捕获 2 个或更多单词字符 \w{2,}
后跟 Model
。
通过这种方式,您可以匹配不需要的内容,并在一个组中捕获您想要的内容。
你的比赛在第 1 组中。
详情
\w*
匹配零个或多个单词字符ViewModel
字面匹配|
或(\w{2,}Model)
在一组中捕获 2 个或更多单词字符后跟模型\b
字边界
并不是所有的正则表达式风格都像 JS 一样支持后视 (?<=...)
/ (?<!...)
(Chrome 到目前为止有支持)。但是您可以使用先行解决此问题:
\b(?!\w*ViewModel\b)\w{2,}Model\b
细分:
\b
匹配单词边界(?!
负先行开始\w*ViewModel\b
单词不应以ViewModel
结尾
)
前瞻结束\w{2,}Model\b
匹配以Model
结尾的整个单词