无法了解正则表达式中的匹配项

时间:2018-06-29 11:20:04

标签: regex

我正在尝试在公司代码中匹配各种类似SQL的表达式。

我们有两种类型的INSERT:

1) let weather = new Vue ({ el: '#weather', data: { error: '', lat: 0, lon: 0, apiUrl: '', city: '', country: '', icon: '', description: '', results: [], }, methods: { getPosition: function() { if (navigator.geolocation){ var vm = this; navigator.geolocation.getCurrentPosition(this.updatePosition); }else{ this.error = 'Geolocation is not supported.'; } }, updatePosition: function(position) { this.lat = position.coords.latitude; this.lon = position.coords.longitude; }, getWeather: function(){ let url = buildWeatherUrl(this.lat, this.lon); axios .get(url) .catch(function (error) { console.log(error); }) .then(function (response) { console.log(response.data); });
在这种情况下,InsertInto("TABLE").Values("FIELD_1", "VALUE_1", "FIELD_2", "VALUE_2").Execute()函数调用的参数总是偶数

2)Values
其中InsertInto("TABLE").Values("FIELD_1", "FIELD_2", selectExpression).Execute()是一个包含SELECT查询的变量,
这里对参数的数量没有限制

我正在使用以下正则表达式(简体)来匹配第一种情况的selectExpression语句:

Values

出乎意料的是,它也匹配具有奇数个参数的第二种情况

https://regex101.com/r/YF5f9i/1

我完全不知道怎么可能,因为Values\(((?<insertfield>"\w+"),\s*(?<insertvalue>(\w|[ .()])+),?\s*)+\)似乎根本不匹配:

enter image description here

1 个答案:

答案 0 :(得分:1)

它匹配。之后它只是匹配另一个时间。 Regex101仅显示最后一场比赛

Values\(((?<insertfield>"\w+"),\s*(?<insertvalue>(\w|[ .()])+),?\s*)+\)

InsertInto("TABLE").Values("FIELD_1", "FIELD_2", selectExpression).Execute()上 通往核心

((?<insertfield>"\w+"),\s*(?<insertvalue>(\w|[ .()])+),?\s*)+

"FIELD_1", "FIELD_2", selectExpression).Execute(上(如果要非常清楚,请以^开头,以$结尾)

为简化起见:(\w|[ .()])+[\w .()]+相同

((?<insertfield>"\w+"),\s*(?<insertvalue>[\w .()]+),?\s*)+适用于"FIELD_1",(后跟一个空格)以及"FIELD_2", selectExpression).Execute(

这意味着未命名的组(在您的示例中为“组1”)具有2个捕获(?<unnamedGroup>(?<insertfield>"\w+"),\s*(?<insertvalue>[\w .()]+),?\s*)+

  1. "Field_1",
  2. "FIELD_2", selectExpression).Execute(

由于Regex102仅显示最后一个捕获,因此显示"FIELD_2", selectExpression).Execute(

这让我有些紧张地发现...