我正在尝试在公司代码中匹配各种类似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*)+\)
似乎根本不匹配:
答案 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*)+
"Field_1",
"FIELD_2", selectExpression).Execute(
由于Regex102仅显示最后一个捕获,因此显示"FIELD_2", selectExpression).Execute(
这让我有些紧张地发现...