使用regexp时遇到问题。我有以下格式的代码。
(01)123456789(17)987654321
现在我要捕获命名组中(01)
之后的数字:group01
以及命名组中(17)
之后的数字:group17
。
问题是代码可能是这样的不同顺序:
(17)987654321(01)123456789
命名组应包含相同的内容。
任何想法?
谢谢Marco
答案 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)
没有团体,但在我看来,这样的一点点清晰可能不适合你。
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'}