【问题标题】:Javascript regex to find quotes in text not preceded by brackets and not followed by bracketsJavascript正则表达式查找文本中不带括号且不带括号的引号
【发布时间】:2017-09-01 21:52:01
【问题描述】:

背景

我需要用双引号替换单引号,但只有在左括号和右括号之前没有的单引号。我开发了一个节点脚本来将 java i18n 属性文件转换为更易于翻译器使用的 Excel 文件。该脚本可以将属性文件转换为 xlsx 文件,然后将 xlsx 文件转换为属性文件。 java 项目资源中的引号必须加倍(关于 MessageSource 文档),但我不想要求翻译人员直接在 Excel 表中将它们加倍。

问题

我在创建一个 javascript 正则表达式来查找前面没有括号和后面没有括号的简单引号时遇到了一些困难。

例如,我有这样的文字:

约翰的车有“{value}”个轮子。

正则表达式应该只返回第一个引号,而不是后面的两个引号。

我在 Javascript 中需要这个正则表达式,问题是我不能使用“lookbehind”运算符,因为它不受支持。

我试过了:

(?!\})'(?!\{)

但它继续捕获“}'”。

【问题讨论】:

标签: javascript regex


【解决方案1】:

您似乎只需要匹配以'{ 开头的任何子字符串,然后包含除大括号以外的任何字符并以}' 结尾并跳过这些匹配项,并在任何其他上下文中匹配' 以替换为@987654324 @。

像这样在replace 中使用回调

var s = "The John's car '  has '{value}' wheels.";
s = s.replace(/('{[^{}]*}')|'/g, function($0,$1) { return $1?$1:'"';});
console.log(s);

详情

  • ('{[^{}]*}') - 第 1 组(在回调中用 $1 引用):'{...}' 子字符串:
    • '{ - '{ 子字符串
    • [^{}]* - 除 {} 之外的任何 0+ 个字符
    • }' - }' 子字符串
  • | - 或
  • ' - 任何其他上下文中的单引号

在回调内部,$0 是一个保存整个匹配项的变量,$1 引用捕获到第 1 组的值。

【讨论】:

    【解决方案2】:

    为什么不简单:

    [^{}]'[^{}]|[^{}]'$|^'[^{}]
    

    test

    【讨论】:

      【解决方案3】:

      如果你的例子是相关的,你可以这样做

      \b'\b
      

      var str = "The John's car has '{value}' wheels.";
      
      document.write("Should only be one: " + str.match(/\b'\b/g));
      document.write("<br/>Should be all: " + str.match(/'/g));

      它使用\b(匹配单词边界)使其仅匹配'边界单词字符。

      Better illustrated here at regex101.

      【讨论】:

      • 我也需要前面有空格或后面有空格的引号。因此,如果我有以下文字: > John 的车有 '{value}' 轮子。我需要得到相同的结果。
      猜你喜欢
      • 1970-01-01
      • 2016-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多