首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在带引号的字符串中搜索特定字符

在带引号的字符串中搜索特定字符
EN

Stack Overflow用户
提问于 2011-09-08 07:15:20
回答 1查看 162关注 0票数 1

我对正则表达式完全陌生,但我计划很快掌握它。现在,我需要您的帮助来完成以下工作:

我想查找所有位于文字/引号(“)字符串之间的逗号(,)。

例如:

代码语言:javascript
运行
AI代码解释
复制
"bla bla , bla bla"

还有:

代码语言:javascript
运行
AI代码解释
复制
","

但如果它是参数分隔符,则不是这样的,例如:

代码语言:javascript
运行
AI代码解释
复制
Replace("abc","b","f")

如果你知道regexp,也许这很简单,但对我来说(目前)还不是。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-08 07:19:57

您可以从下面的内容开始

代码语言:javascript
运行
AI代码解释
复制
"[^"]*"

这是匹配引用内容的最简单方法。然后将其更改为与逗号模式相匹配。

代码语言:javascript
运行
AI代码解释
复制
"[^",]*,[^"]*"

但是您不想捕获逗号,所以您将其设置为一个组

代码语言:javascript
运行
AI代码解释
复制
"[^",]*(,)[^"]*"

然后,为了能够在一个字符串中找到多个逗号,您可以对非捕获组使用重复。

代码语言:javascript
运行
AI代码解释
复制
"(?:[^",]*(,))+[^"]*"

正则表达式在某种程度上是有局限性的,如果使用得当,效果会更好。上面的模式查找引号,查找不带逗号的内容,然后继续查找。它基于第一个组的重复,这样它就可以在字符串中找到可能的逗号(当您进行匹配时,您将在该组的Captures属性中访问它们)。

代码语言:javascript
运行
AI代码解释
复制
var regex = new Regex("\"(?:[^\",]*(,))+[^\"]*\"");
var m = regex.Match("a,b,c");
m.Groups[1].Captures // <-- all commas are captured in this collection

只要字符串本身不包含引号,就可以很好地工作,但是很难使用正则表达式接受带引号的字符串中的转义序列。他们不擅长处理的事情。所以,只要没问题,就随它去吧。

现在来看看当你有这种类型的字符串"a","b"时的问题。使用正则表达式扫描字符串将从左到紧进行匹配,并按此顺序使用字符,如果任何匹配成功,它将无法以任何其他方式继续匹配它。这里的问题是没有引号的带引号的字符串不是成功的匹配(如果我们让它匹配,但忽略它,我们可以解决这个问题)。

我们总是首先尝试我们的初始派生,但回退到我们忽略的简单引号字符串,这样它就会跳过头部,而不会将字符串的中间部分视为有效匹配。这一切都是为了确保状态机,即正则表达式可以跟踪引用值的开始和结束。

代码语言:javascript
运行
AI代码解释
复制
"(?:[^",]*(,))+[^"]*"|"[^"]*"

这就是您的最终解决方案,但是您必须检查Group[1]是否成功,因为现在如果模式找到一个带引号的字符串,那么它就成功了,但是捕获组Group[1]没有成功。

代码语言:javascript
运行
AI代码解释
复制
var regex = new Regex("\"(?:[^\",]*(,))+[^\"]*\"|\"[^\"]*\"");
var m = regex.Match("a,b,c");
if (m.Groups[1].Success)
{
    // Do your thing ;)
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7344464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档