我希望匹配包含在<<<<和>>标签。
这个正则表达式的电话号码:
0[2349]{1}\-[1-9]{1}[0-9]{6}
我厌倦了像(?=(?:>>))
那样添加前瞻(和后瞻),但这对我不起作用。
答案 0 :(得分:2)
以下似乎有效(as seen on ideone.com):
Regex r = new Regex(@"(?s)<<(?:(?!>>)(?:(0[2349]\-[1-9][0-9]{6})|.))*>>");
每个<<...>>
部分都是Match
,该部分中的所有电话号码都将在Group[1].Captures
中捕获。
首先,我将您的电话号码模式简化为:
0[2349]\-[1-9][0-9]{6}
也就是说,{1}
是多余的,所以它们会被抛弃(见Using explicitly numbered repetition instead of question mark, star and plus)。
然后,让我们尝试匹配每个<<...>>
部分。让我们从:
(?s)<<((?!>>).)*>>
这将匹配每个<<..>>
部分。捕获身体的.*
由负向前瞻(?!>>)
保护,因此我们不会超出界限。
然后,我们优先考虑匹配您的电话号码,而不是匹配.
。也就是说,我们将<{1}}替换为
.
然后我只是让一些群组无法捕获,并且电话号码捕获到(phonenumber|.)
,这就是它。 .NET regex在一场比赛中存储由一个组进行的所有捕获的事实解决了其余的问题。
答案 1 :(得分:0)
<<0[2349]{1}\-[1-9]{1}[0-9]{6}>>
答案 2 :(得分:0)
答案 3 :(得分:0)
这可以通过两种正则表达式模式轻松完成:
识别部分:
<<.*>>
在第一个匹配项中使用第二个正则表达式:
0[2349]-[1-9]\d{6}
请记住将点设置为匹配新行。 我知道这不是你要求的,但它会起作用。
答案 4 :(得分:0)
我认为gnarf(和Arkain的)建议非常明智 - 你不必使用一个正则表达式完成所有的工作。
但是,如果你真的想要使用一个难以阅读的不可移植(仅在.Net中工作,而不是在其他正则表达式引擎中使用正则表达式),请转到:
(?<=<<(?:>?[^>])*)0[2349]{1}\-[1-9]{1}[0-9]{6}(?=(?:<?[^<])*>>)