我正在摆弄正则表达式,以缩短我一直在使用的字符串拆分程序。
我的购物车有一个字符串,提交给asp脚本,如下所示:
addnothing|-1, addRST115400112*2xl|0, addnothing|-1, addnothing|-1, addRST115400115*xs|0, addnothing|-1
我希望能够提取代表两个库存商品的两个条目:
addRST115400112*2xl|0
addRST115400115*xs|0
我设法让这些代码工作但我不确定我正在使用的模式:
add[^n](.*)\*(.*)\|[0-9],
这会返回:
addRST115400112*2xl|0, addnothing|-1, addnothing|-1, addRST115400115*xs|0,
但我只希望它返回:
addRST115400112*2xl|0
addRST115400115*xs|0
有人能指出我正确的方向吗?
答案 0 :(得分:1)
你匹配它贪婪(.*
尽可能多地吃,所以在你的情况下它最终吃到最后\|[0-9]
即|0
)
您应该使用.*?
代替.*
来匹配懒惰
所以你的正则表达式应该是
add(?!nothing)(.*?)\*(.*?)\|\d
\d
与[0-9]
(?!nothing)
只是一个检查..它不匹配或消耗任何东西..比[^n]
更好,因为它更可靠,富有表现力且不吃任何东西
答案 1 :(得分:0)
尝试保持.Pattern简单(这是VBScript!)并且更容易修补它(真正单挑库存物品的方法并不明确):
Dim sInp : sInp = "addnothing|-1, addRST115400112*2xl|0, addnothing|-1, addnothing|-1, addRST115400115*xs|0, addnothing|-1"
Dim reCut : Set reCut = New RegExp
reCut.Global = True
reCut.Pattern = "addR[^|]+\|\d"
Dim oMTS : Set oMTS = reCut.Execute(sInp)
If 2 = oMTS.Count Then
WScript.Echo "Success:", Join(Array(oMTS(0).Value, oMTS(1).Value))
Else
WScript.Echo "Bingo:", reCut.Pattern
End If
输出:
Success: addRST115400112*2xl|0 addRST115400115*xs|0