【发布时间】:2015-04-13 13:01:31
【问题描述】:
我正在尝试使用正则表达式并遇到以下问题。
说,我有以batman 开头和结尾的行,中间有一些任意数字,我想要捕获组中的数字以及单词batman。
batman 12345 batman
batman 234 batman
batman 35655 batman
batman 1311 batman
这很容易实现(简单的一个 => (\s*batman (\d+) batman\s*) DEMO)。
现在我尝试了更多.. 将相同的数据放入 capture tag (#capture)
#capture
batman 12345 batman
batman 234 batman
batman 35655 batman
batman 1311 batman
#capture
#others
batman 12345 batman
batman 234 batman
batman 35655 batman
batman 1311 batman
#others
我试图只捕获#capture 之间的行,我尝试过
(?:#capture)(\s*batman (\d+) batman\s*)*(?:#capture)
匹配模式但仅包含捕获组中的最后一次迭代,即$1=>batman $2=>1311 $1=>batmanDEMO
我还尝试使用
捕获重复组(?:#capture)((\s*batman (\d+) batman\s*)*)(?:#capture)
这个捕获了所有内容.. 但在不同的组中.. DEMO
有人可以帮我理解和解决这个问题吗?
预期结果:仅捕获#capture 中的组和组中的所有数字,以便轻松替换。
谢谢。
【问题讨论】:
-
你说你想要任何语言,但你使用了只有 C♯ 支持的东西。这不是命名/执行捕获的标准方式。
-
抱歉......我对逻辑更感兴趣......我将问题更新为特定于语言的问题。
-
哦,我明白了。请分别提供原始输入字符串和所需的输出结果,因为仍然不清楚您想要什么。您将无法在一场比赛中仅捕获所有数字,因为它们是不连续的。您将需要更多的程序逻辑来解决这个问题。如果您涉及换行符,您还必须使用
(?s)模式。你可以做通行证,一个得到/#capture((?s:(?!#capture).)*)#capture/,然后另一个得到第一个得到的所有/\b(\d+)\b/匹配。如果您需要更多batman约束,那么您可以添加这些。 -
@tchrist 这是一个很好的解决方法.. 在应用程序中使用时我一定会牢记这一点。