毫无疑问,这是一种更好的方法,但这是我要求我这样做的方式。
我正在为我的网络应用程序创建搜索表单。我想使用基于标记的搜索。所以我使用正则表达式来使它工作。
所以我有一个搜索字符串:' c:约翰客户:15478' 正则表达式需要找到标记(c :)和参数(john),删除标记,并给我参数 - 它需要对标记的所有实例及其参数执行此操作。我的正则表达式很接近,但它没有正常工作。它不会抓取每个参数,也不会以一致的方式删除标记。所以问题是:我的正则表达式有什么问题需要修复才能获得正确的结果?
目前,它会找到第一个标记,获取其参数以及其后的所有其他内容。我需要它来找到一个参数后停止匹配。即在上面的情况下,它将匹配约翰客户:15478
也许一个更好的问题是如何使VB的正则表达式返回第一个冒号和下一个标记的开头之间的所有内容(后面跟着另一个冒号)或者在下一个结尾处停止匹配标记
正则表达式:
(?<=({0}({1})??:)+?)(\S+\s*\S*)(?=\s+?\b\w+:.+?)??
{0}
和{1}
表示使用字符串的String.format调用,比如Customer(但它可以是任何东西)来定义标记。 {0}
是第一个字符,{1}
是其余字符。此正则表达式将匹配标记后面的任何内容,包括另一个标记及其参数(如果存在)。所以对于字符串
"c:5401 4664 c:john smith p:joam d:domain.com p:1548 c:215-548-5487 d:""192.168.0.1"""
比赛将是
'5401 4664, john smith, 215-548-5487 d:"192.168.0.1"'
'domain.com p:1548, "192.168.0.1"'
'joam d:domain.com, 1548 c:215-548-5487'
给出我定义的标签。正则表达式无法在下一个标记的开头停止匹配。
答案 0 :(得分:1)
如果我不正确,你应该解决这个问题:
/\w+:([^:]+)(?:\s|$)/g
https://regex101.com/r/vN6fH1/1
并使用已定义的标记,它将如下所示:
/{0}({1})?:([^:]+)(?:\s|$)/g
但这仍然依赖于分号而不是标记名称
(如果您没有传递字符串中的标记名称,那么它根本不会匹配)