正则表达式匹配子串的顺序无关紧要

时间:2011-07-12 21:41:49

标签: regex

使用regexp时遇到问题。我有以下格式的代码。

(01)123456789(17)987654321

现在我要捕获命名组中(01)之后的数字:group01以及命名组中(17)之后的数字:group17

问题是代码可能是这样的不同顺序:

(17)987654321(01)123456789

命名组应包含相同的内容。

任何想法?

谢谢Marco

6 个答案:

答案 0 :(得分:1)

在Python,PCRE和PHP中

(?:(?<=\(17\))(?<group17>\d+)|(?<=\(01\))(?<group01>\d+)|.)+

.Net支持上述语法和这一句:

(?:(?<=\(17\))(?'group17'\d+)|(?<=\(01\))(?'group01'\d+)|.)+

答案 1 :(得分:1)

这对我有用:

(?<group01>\(01\))[0-9]{9}|(?<group17>\(17\))[0-9]{9}

答案 2 :(得分:1)

每个人似乎都在硬编码“01”和“17”。这是一个更通用的解决方案:

while ( my $data =~ /\((\d+)\)(\d+)/g ) {
    my $group_number = $1;
    my $group_data   = $2;
    $group{$group_number} = $group_data;
}

只要您的数据中存在未满足的(numbers)numbers模式匹配,它就会连续抓取每个模式。在这个Perl片段中,它将每个组的数据存储到键组号上的哈希值。

答案 3 :(得分:0)

你没说什么语言,他们都有自己的怪癖。但是如果在()之后总是有9位数,那么这样的东西应该有用。 (在Ruby中)

没有团体,但在我看来,这样的一点点清晰可能不适合你。

string = "(01)123456789(17)987654321"
group17 = string =~ /\(17\)\d{9}/
group01 = string =~ /\(01\)\d{9}/

string[group17+4,9]
string[group01+4,9]

编辑: 在ruby 1.9中使用命名捕获组:

string = "(01)123456789(17)987654321"
if string =~ /\(17\)(?<g17>\d{9})/
  match = Regexp.last_match 
  group17 = match[:g01]
end
if string =~ /\(01\)(?<g01>\d{9})/
  match = Regexp.last_match 
  group01 = match[:g01]
end

答案 4 :(得分:0)

寻找类似的东西?

(01|17)(\d*?)(01|17)(\d*?)

预期比赛: 0 =&gt;在大多数情况下整场比赛 1 =&gt; 01或17 2 =&gt;第一个小数字符串 3 =&gt;第二或第十二 4 =&gt;第二个十进制字符串

告诉我它是否有帮助。

答案 5 :(得分:0)

  

有些人在面对问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。 - 杰米·扎温斯基

除了Glib引用外,正则表达式似乎有点矫枉过正。 Python代码:

string = "(17)987654321(01)123456789"

substrings = [s for s in string.split("(") if len(s) > 0]

results = dict()

for substring in substrings:
    substring = substring.split(")")
    results["group" + substring[0]] = substring[1]

print results

>>> {'group17': '987654321', 'group01': '123456789'}