为什么我不能在子字符串中捕获多于一位的数字?
Why can't I capture more than one digit in substring?
我正在创建正则表达式以从日志文件中提取各种字段。我使用一些工具创建了一个正则表达式,它几乎完成了。唯一的问题是对于一个字段,它只提取一位数字而不是完整数字。为了更好地理解,我将其保存在 link.
下面
模式:
/(?=[^P]*(?:ParNew|P.*ParNew|PSYoungGen|DefNew))^(?:).*(?P<ParNew_before_1>\d)K\->(?P<ParNew_after_1>\d+)K\((?P<young_heap_size>\d+)K\), (?P<par_new_duration>\d+\.\d+) secs\] (?P<ParNew_before_2>\d+)K\->(?P<ParNew_after_2>\d+)K\((?P<total_heap_size>\d+)/
字符串:
146372.273: [GC146372.274: [ParNew: 378633K->88155K(419456K), 0.0313803 secs] 9893391K->9602913K(12478080K), 0.0320299 secs] [Times: user=0.32 sys=0.01, real=0.03 secs]
当前输出:
Full match `146372.273: [GC146372.274: [ParNew: 378633K->88155K(419456K), 0.0313803 secs] 9893391K->9602913K(12478080`
Group `ParNew_before_1` `3`
Group `ParNew_after_1` `88155`
Group `young_heap_size` `419456`
Group `par_new_duration` `0.0313803`
Group `ParNew_before_2` `9893391`
Group `ParNew_after_2` `9602913`
Group `total_heap_size` `12478080`
预期输出:
Full match `146372.273: [GC146372.274: [ParNew: 378633K->88155K(419456K), 0.0313803 secs] 9893391K->9602913K(12478080`
Group ParNew_before_1
378633
Group `ParNew_after_1` `88155`
Group `young_heap_size` `419456`
Group `par_new_duration` `0.0313803`
Group `ParNew_before_2` `9893391`
Group `ParNew_after_2` `9602913`
Group `total_heap_size` `12478080`
在上面的例子中:组 ParNew_before_1
只提取一位数字。
这里我想说明三点:
- lookahead 应该放在
^
之后(只在字符串的开头检查它的模式会更有意义)
\d
不会匹配超过1个数字,在它后面添加+
匹配1个或更多
.*
太贪心,用懒.*?
.
使用
^(?=[^P]*(?:ParNew|P.*ParNew|PSYoungGen|DefNew)).*?(?P<ParNew_before_1>\d+)K->(?P<ParNew_after_1>\d+)K\((?P<young_heap_size>\d+)K\), (?P<par_new_duration>\d+\.\d+) secs\] (?P<ParNew_before_2>\d+)K\->(?P<ParNew_after_2>\d+)K\((?P<total_heap_size>\d+)
^^^ ^ ^ ^
此外,您不需要转义不在字符 类.
内的 -
顺便说一句,当你有一个长模式时,请不要犹豫使用 x 修饰符 (对于 "free-spacing" 模式) 并最终使用引用功能 \Q..\E
(计算空格和特殊字符而不转义它们) 使其更具可读性:
/
^
(?=
[^PD\n]* (?>[PD][^\nPD]*)*? \b
(?: ParNew | PSYoungGen | DefNew )
)
[^\n\d]* (?>\d+[^\n\d]+)*? \b
(?<ParNew_before_1> \d+ ) K->
(?<ParNew_after_1> \d+ ) \QK(\E
(?<young_heap_size> \d+ ) \QK), \E
(?<par_new_duration> \d+\.\d+ ) \Q secs] \E
(?<ParNew_before_2> \d+ ) K->
(?<ParNew_after_2> \d+ ) \QK(\E
(?<total_heap_size> \d+ )
/x
我正在创建正则表达式以从日志文件中提取各种字段。我使用一些工具创建了一个正则表达式,它几乎完成了。唯一的问题是对于一个字段,它只提取一位数字而不是完整数字。为了更好地理解,我将其保存在 link.
下面模式:
/(?=[^P]*(?:ParNew|P.*ParNew|PSYoungGen|DefNew))^(?:).*(?P<ParNew_before_1>\d)K\->(?P<ParNew_after_1>\d+)K\((?P<young_heap_size>\d+)K\), (?P<par_new_duration>\d+\.\d+) secs\] (?P<ParNew_before_2>\d+)K\->(?P<ParNew_after_2>\d+)K\((?P<total_heap_size>\d+)/
字符串:
146372.273: [GC146372.274: [ParNew: 378633K->88155K(419456K), 0.0313803 secs] 9893391K->9602913K(12478080K), 0.0320299 secs] [Times: user=0.32 sys=0.01, real=0.03 secs]
当前输出:
Full match `146372.273: [GC146372.274: [ParNew: 378633K->88155K(419456K), 0.0313803 secs] 9893391K->9602913K(12478080`
Group `ParNew_before_1` `3`
Group `ParNew_after_1` `88155`
Group `young_heap_size` `419456`
Group `par_new_duration` `0.0313803`
Group `ParNew_before_2` `9893391`
Group `ParNew_after_2` `9602913`
Group `total_heap_size` `12478080`
预期输出:
Full match `146372.273: [GC146372.274: [ParNew: 378633K->88155K(419456K), 0.0313803 secs] 9893391K->9602913K(12478080`
Group
ParNew_before_1
378633
Group `ParNew_after_1` `88155`
Group `young_heap_size` `419456`
Group `par_new_duration` `0.0313803`
Group `ParNew_before_2` `9893391`
Group `ParNew_after_2` `9602913`
Group `total_heap_size` `12478080`
在上面的例子中:组 ParNew_before_1
只提取一位数字。
这里我想说明三点:
- lookahead 应该放在
^
之后(只在字符串的开头检查它的模式会更有意义) \d
不会匹配超过1个数字,在它后面添加+
匹配1个或更多.*
太贪心,用懒.*?
.
使用
^(?=[^P]*(?:ParNew|P.*ParNew|PSYoungGen|DefNew)).*?(?P<ParNew_before_1>\d+)K->(?P<ParNew_after_1>\d+)K\((?P<young_heap_size>\d+)K\), (?P<par_new_duration>\d+\.\d+) secs\] (?P<ParNew_before_2>\d+)K\->(?P<ParNew_after_2>\d+)K\((?P<total_heap_size>\d+)
^^^ ^ ^ ^
此外,您不需要转义不在字符 类.
内的-
顺便说一句,当你有一个长模式时,请不要犹豫使用 x 修饰符 (对于 "free-spacing" 模式) 并最终使用引用功能 \Q..\E
(计算空格和特殊字符而不转义它们) 使其更具可读性:
/
^
(?=
[^PD\n]* (?>[PD][^\nPD]*)*? \b
(?: ParNew | PSYoungGen | DefNew )
)
[^\n\d]* (?>\d+[^\n\d]+)*? \b
(?<ParNew_before_1> \d+ ) K->
(?<ParNew_after_1> \d+ ) \QK(\E
(?<young_heap_size> \d+ ) \QK), \E
(?<par_new_duration> \d+\.\d+ ) \Q secs] \E
(?<ParNew_before_2> \d+ ) K->
(?<ParNew_after_2> \d+ ) \QK(\E
(?<total_heap_size> \d+ )
/x