RegEx麻烦,忽略尾随]

时间:2016-09-09 16:34:39

标签: regex

我正在解析一个包含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

我正在使用此网站进行测试:

https://regex101.com/

这是我的正则表达式:

12345,6789]

我做错了什么?

修改

我尝试了几种不同的建议非贪婪解决方案,但似乎并没有解决问题。

我尝试的表达式变体将适用于单行变体,但不适用于所有3种。

评论中的

sln有两个建议的解决方案,两者都有效。

1 个答案:

答案 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)