我对正则表达式全新,但我打算很快掌握它。现在我需要你的帮助才能完成以下任务:
我想找到文字/引号(“)字符串之间的所有逗号(,)。
例如:
"bla bla , bla bla"
还有:
","
但不是如果它是一个参数分隔符,如:
Replace("abc","b","f")
如果你知道正则表达式,也许这很简单,但对我来说不是(还);)。
答案 0 :(得分:1)
你从这样的事情开始
"[^"]*"
这是匹配引用内容的最简单方法。然后,将其更改为与逗号模式匹配。
"[^",]*,[^"]*"
但是你不想捕获逗号,所以你把它变成了一个组
"[^",]*(,)[^"]*"
然后,为了能够在一个字符串中找到许多逗号,您可以使用非捕获组重复。
"(?:[^",]*(,))+[^"]*"
这应该对你有用,正则表达式有些限制,正确使用时效果最好。上面的模式查找一个quot,并查找不是逗号引号然后继续查找的内容。它基于第一组的重复,这样它就可以在字符串中找到逗号(当你进行匹配时,你将在该组的Captures属性中访问它们。)
var regex = new Regex("\"(?:[^\",]*(,))+[^\"]*\"");
var m = regex.Match("a,b,c");
m.Groups[1].Captures // <-- all commas are captured in this collection
只要字符串本身不包含引号,这将很好地工作,但很难接受带有正则表达式的带引号的字符串中的转义序列。那些他们不善于处理的东西。所以,只要那么好,就去吧。
现在有了这种类型的字符串"a","b"
的情况。使用正则表达式扫描字符串将从左到右匹配并按顺序使用字符,如果任何匹配成功,则无法以任何其他方式匹配它。这里的问题是没有引号的带引号的字符串不是成功的匹配(如果我们使它匹配,但忽略它我们可以解决这个问题。)
我们总是首先尝试我们的初始推导,但是回退到我们忽略的普通引用字符串,这样它将跳过头部并且不将字符串的中间视为有效匹配。这就是确保状态机,即正则表达式能够跟踪引用值的开启和关闭。
"(?:[^",]*(,))+[^"]*"|"[^"]*"
这是您的最终解决方案,但您必须检查Group[1]
是否成功,因为现在模式成功,如果找到带引号的字符串但捕获组Group[1]
不是。
var regex = new Regex("\"(?:[^\",]*(,))+[^\"]*\"|\"[^\"]*\"");
var m = regex.Match("a,b,c");
if (m.Groups[1].Success)
{
// Do your thing ;)
}