【问题标题】:Regex not matching double quotations in string (just single quotations)正则表达式不匹配字符串中的双引号(只是单引号)
【发布时间】:2018-06-15 22:50:35
【问题描述】:

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

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

(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)

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

【问题讨论】:

  • 你能提供一些测试输入字符串吗?
  • @Gurman 输入字符串来自 PHP 代码。它搜索项目并在代码中查找匹配项。顺便说一下,我已经用一些例子更新了这个问题。
  • 可以肯定的是,请您发布您的分配声明,如patther := "..."
  • 因为多余的空间不匹配!否则匹配!我在 regex101.com 上检查了它。 see here
  • @csabinho 哦。我想是这样的。您能否提供正则表达式来匹配答案中的空格(如果存在)?

标签: regex go regex-group


【解决方案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*)*\)

【讨论】:

  • 感谢您的简短解释。我想在可能包含空格的地方添加\s* 也可以解决问题。
  • @sobhanbagheri 我试图将其包含在我的替代解决方案中,如图所示HERE
  • 替代正则表达式有一个小问题,导致一些非法字符串(不是翻译)匹配和捕获。我想这是一个更好的(非捕获组已被删除):Yii::t\(\s*['"][^'"]*['"]\s*\,\s*['"][^'"]*['"]\s*\)
  • 满足你的要求就可以了。 :)
【解决方案2】:

这个 RegEx 匹配所有内容:

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

See here

【讨论】:

    【解决方案3】:

    试试这个正则表达式,这匹配一切:

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

    Click here for output !

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-26
      • 1970-01-01
      • 1970-01-01
      • 2016-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-13
      相关资源
      最近更新 更多