Regex 如何将前一个元素获取零次或多次,但次数越少越好?
我的输入是:Regex 如何将前一个元素获取零次或多次,但次数越少越好?,regex,Regex,我的输入是:abc1 abc2 abc3 abc4 我不想得到a,也不想得到任何字符,但要尽可能少地得到3 输出必须以a开始,并以世界上的每个字符继续,除了与a对应的字符外,以3结束,其中a是Regax表达式 但是如果我使用模式:a.*3,匹配的是:abc1 abc2 abc3,但我希望abc3 我不能使用a[^a]*?3,因为a事先是未知的 如何在.NET正则表达式中实现这一点?您希望匹配一些通用模式,然后匹配任何与值模式不匹配的文本,直到右分隔符模式的最左边出现 在这种情况下,你需要做什么
abc1 abc2 abc3 abc4
我不想得到a
,也不想得到任何字符,但要尽可能少地得到3
输出必须以a
开始,并以世界上的每个字符继续,除了与a
对应的字符外,以3
结束,其中a
是Regax表达式
但是如果我使用模式:a.*3
,匹配的是:abc1 abc2 abc3
,但我希望abc3
我不能使用a[^a]*?3
,因为a
事先是未知的
如何在.NET正则表达式中实现这一点?您希望匹配一些通用模式,然后匹配任何与值模式不匹配的文本,直到右分隔符模式的最左边出现 在这种情况下,你需要做什么
- 将起始模式分成一组
- 使用对组值的反向引用作为负的先行模式,确保量词是非贪婪的
a
起始分隔符模式被混淆为(?![b-z])[a-z]
:
((?![b-z])[a-z])(?:(?!\1).)*?3
看。所以,它是匹配的
-捕获组1:任何小写ASCII,但从((?![b-z])[a-z])
到b
范围的字母(基本上是z
)a
-任何字符(换行字符除外),不启动存储在组1中的值的0次或多次出现(但尽可能少)(?:(?!\1)。*?
-右侧分隔符,3
3
- 为什么不
\w
或\S
而不是
?你说“a事先不知道”,那是什么?如果你有(\w+)
,那么使用(?:(?!\1)。*
你可以做*(a.*3)
。期望的结果将在第1组中。您能告诉我您期望的结果吗?当你说-a和任何字符时,你都不是很清楚,但要尽可能少地说,3
可能是这样的:\ba\S*?3
@404 inabc1 abc2 abc3 abc4,abc1 abc2 abc3 abc4
我只得到最后一个abc3
。