我正在解析一个包含3行变体的日志文件,并且我正在尝试构建匹配所有变体的正则表达式。
以下是行变化:
func mapView(mapView: GMSMapView, didLongPressAtCoordinate coordinate: CLLocationCoordinate2D) {
let marker = GMSMarker(position: coordinate)
marker.map = mapView
}
我所拥有的当前表达式匹配所有情况,除了#3。
我期待2组。使用上面的行,第一组将是12345或12345,6789第二组将只是8756
我遇到的问题是线路变化#3。结束括号]包含在第一个匹配组中。
因此对于第3行,第一组结果是:
StatementId: [12345], UserId: 8756
StatementId: 12345, UserId: 8756
StatementId: [12345,6789], UserId: 8756
我正在使用此网站进行测试:
这是我的正则表达式:
12345,6789]
我做错了什么?
修改:
我尝试了几种不同的建议非贪婪解决方案,但似乎并没有解决问题。
我尝试的表达式变体将适用于单行变体,但不适用于所有3种。
解:
评论中的sln有两个建议的解决方案,两者都有效。
答案 0 :(得分:1)
您可以使用重新使用捕获组的分支重置(?|..)
http://www.regex101.com/r/gX8qK6/1
StatementId:[ ](?|\[([^\[\]]*)\]|(.*?)),.*UserId:[ ]([0-9]*)
StatementId: [ ]
(?|
\[
( [^\[\]]* ) # (1)
\]
|
( .*? ) # (1)
)
, .* UserId: [ ]
( [0-9]* ) # (2)
或,
不使用分支重置,它将组转换为额外的捕获组
对于有/无[]
的两种情况
http://www.regex101.com/r/gX8qK6/2
(注意 - 这种情况是一种独家捕获 意味着你可以盲目地连接组1& 2形成字符串。)
StatementId:[ ](?:\[([^\[\]]*)\]|(.*?)),.*UserId:[ ]([0-9]*)
StatementId: [ ]
(?:
\[
( [^\[\]]* ) # (1)
\]
|
( .*? ) # (2)
)
, .* UserId: [ ]
( [0-9]* ) # (3)