正则表达式不匹配字符串中的双引号(只是单引号)

标签 regex go regex-group

我编写了这个正则表达式来匹配翻译字符串。一切正常,除了它只匹配字符串中的单引号 '' ,尽管我已经编写了几个规则来匹配单引号和双引号。

这是我的正则表达式规则:

(Yii::t\()(\'|\")(.*?)(\'|\")\,(\'|\")(.*?)(\'|\")\)

正如预期的那样,(\'|\") 应该同时匹配这两个,但事实并非如此。

我也尝试过以下规则:

('|")
(['"])

例子:

成功匹配这些:

Yii::t('backend','My Profile')
Yii::t('backend','Log Out')

不符合这些:

Yii::t("backend", "Search...")
Yii::t("backend", 'Sounds')

我用来匹配正则表达式的代码:

re := regexp.MustCompile(`(Yii::t\()(\'|\")(.*?)(\'|\")\,(\'|\")(.*?)(\'|\")\)`)
matches := re.FindAllString(line, -1)

更新: 问题是因为某些字符串包含空格(不是因为引号)。

最佳答案

试试这个正则表达式:

Yii::t\((?:['"][^'"]*['"],?\s*)*\)

Click for Demo

解释:

  • Yii::t\( - 匹配 Yii::t( 字面意思
  • (?:['"][^'"]+['"],?\s*)*\)
    • ['"] - 匹配 '"
    • [^'"]* - 匹配 0 次以上既不是 ' 也不是 "
    • 的字符
    • ['"] - 匹配单个出现的 '"
    • ,? - 匹配 0 次或 1 次出现的 ,
    • \s* - 匹配出现 0 次以上的空格
    • * - 最后的*匹配以上5个子模式0+次
    • \) - 字面上匹配 )

替代解决方案:

Yii::t\(\s*['"][^'"]*['"]\s*(?:,\s*['"][^'"]*['"]\s*)*\)

关于正则表达式不匹配字符串中的双引号(只是单引号),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48125221/

相关文章:

regex - 正则表达式中的非捕获组是什么?

go - 具有If Else条件的正则表达式

MySQL REGEXP 格式用于将年份范围与文本字段中的斜杠相匹配(即 : 1990/93, 1969/70、1975/2008 等...)

javascript - 正则表达式字符串拆分器

ruby - 检查低效的正则表达式

go - gRPC 客户端流控制如何在 go 中工作?

regex - sed -E 和 sed -e 有什么区别

戈朗 : Hello world doesn't print to screen and program doesnt exit

json - 将 JSON 对象数组解析为单个文档

javascript - 已弃用的 Javascript RegExp 属性的替代方案