我是regex的新手,想要选择一些字符串遵循规则:
选择"美丽"(零或一)和" people00"或" peopleXXX"如果匹配的话。
句子:
现在我使用下面的规则来获取两个字符串
(?i)(beautiful| ).*(people[a-zA-Z0-9]{2,3})
还有其他方法可以选择吗?
我尝试直接使用(beautiful)?.*(people[a-zA-Z0-9]{2,3})
,但它不起作用。
答案 0 :(得分:2)
你在正则表达式中有一个贪婪的点匹配子模式。此.*
无法捕获漂亮的,因为它已与.*
匹配。可选组(beautiful)?
或强制组(beautiful| )
只匹配任何内容(#1,组为#34;非参与")或第一个空格(#2)。为了避免这种情况,您需要限制以匹配漂亮以外的任何内容 peopleXXX 。
一种方法是使用tempered greedy token:
(?i)(beautiful)?(?:(?!beautiful).)*(people[a-zA-Z0-9]{2,3})
^^^^^^^^^^^^^^^^^^^
请参阅demo
(?:(?!beautiful).)*
将匹配任何符号,但换行符不会启动序列beautiful
。
另一种方法是使用这个缓和的贪婪标记的展开版本:
(?i)(beautiful)?[^b]*(?:b(?!eautiful)[^b]*)*(people[a-zA-Z0-9]{2,3})
请参阅another demo
[^b]*(?:b(?!eautiful)[^b]*)*
匹配任何未启动beautiful
字符序列的文本(它将匹配b
以外的字符零次或多次([^b]*
)然后任何数字b
的序列未跟eautiful
(b(?!eautiful)
),然后是b
以外的零个或多个字符。
注意:要使此正则表达式更有效率,peopleXXX
可以include a check:
(?i)(beautiful)?(?:(?!beautiful|people[a-zA-Z0-9]).)*(people[a-zA-Z0-9]{2,3})
(?i)(beautiful)?[^bp]*(?:p(?!oeple[a-zA-Z0-9])[^p*]|b(?!eautiful)[^b]*)*(people[a-zA-Z0-9]{2,3})