我对正则表达式完全陌生,但我计划很快掌握它。现在,我需要您的帮助来完成以下工作:
我想查找所有位于文字/引号(“)字符串之间的逗号(,)。
例如:
"bla bla , bla bla"
还有:
","
但如果它是参数分隔符,则不是这样的,例如:
Replace("abc","b","f")
如果你知道regexp,也许这很简单,但对我来说(目前)还不是。
发布于 2011-09-08 07:19:57
您可以从下面的内容开始
"[^"]*"
这是匹配引用内容的最简单方法。然后将其更改为与逗号模式相匹配。
"[^",]*,[^"]*"
但是您不想捕获逗号,所以您将其设置为一个组
"[^",]*(,)[^"]*"
然后,为了能够在一个字符串中找到多个逗号,您可以对非捕获组使用重复。
"(?:[^",]*(,))+[^"]*"
正则表达式在某种程度上是有局限性的,如果使用得当,效果会更好。上面的模式查找引号,查找不带逗号的内容,然后继续查找。它基于第一个组的重复,这样它就可以在字符串中找到可能的逗号(当您进行匹配时,您将在该组的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 ;)
}
https://stackoverflow.com/questions/7344464
复制相似问题