正则表达式只引用字符串匹配(不是数字)

时间:2013-06-24 08:34:27

标签: javascript regex

我正在努力使用字符串:

"some text [2string] some another[test] and another [4]";

尝试引用[]中的每个值但数字,因此可以将其转换为

"some text ['2string'] some another['test'] and another [4]"

感谢。

5 个答案:

答案 0 :(得分:4)

你需要一个正则表达式

  • 匹配[]之间的内容,i。即一个[,除]以外的任意数量的字符,然后是]
  • 断言此处除了数字之外至少还有一个其他字符。

您可以使用character classesnegative lookahead assertions解决此问题:

result = subject.replace(/\[(?!\d+\])([^\]]*)\]/g, "['$1']");

<强>解释

\[      # Match [
(?!     # Assert that it's impossible to match...
 \d+    # one or more digits
 \]     # followed by ]
)       # End of lookahead assertion
(       # Match and capture in group number 1:
 [^\]]* # any number of characters except ]
)       # End of capturing group
\]      # Match ]

答案 1 :(得分:0)

我会尝试\[(\d*?[a-z]\w*?)]之类的东西。只要内部至少有一个字母,这应匹配任何[...]。如果下划线(_)无效,请将最后的\w替换为[a-z]

  • \[只是[的简单匹配,由于[的特殊含义,必须对其进行转义。
  • \d*?会匹配任意数量的数字(或没有数字),但会尽可能少地完成匹配。
  • [a-z]将匹配给定范围内的任何字符。
  • \w*?将匹配任何“字”(字母数字)字符(字母,数字和下划线),再次尽可能少地完成匹配。
  • ]是另一个简单的匹配,这个不必被转义,因为它没有误导性(在此级别没有打开[)。它可以被转义,但这通常是一种样式首选项(取决于实际的正则表达式引擎)。

答案 2 :(得分:0)

如果性能是一个大问题,那么更长但IMO更清洁的方法:

var string = "some text [2string] some another[test] and another [4]";
var output =  string.replace(/(\[)(.*?)(\])/g, function(match, a, b, c) {
  if(/^\d+$/.test(b)) {
    return match;
  } else {
    return a + "'" + b + "'" + c;
  }
});
console.log(output);

你基本匹配方括号内的每个表达式,然后测试它是否是一个数字。如果是,则按原样返回字符串,否则在特定位置插入引号。

输出:

some text ['2string'] some another['test'] and another [4]

答案 3 :(得分:0)

您可以使用此正则表达式替换它

input.replace(/(?!\d+\])(\w+)(?=\])/g, "'$1'");

答案 4 :(得分:0)

另一种为您的尝试添加简单正则表达式的解决方案:

str.split('[').join("['").split(']').join("']").replace(/\['(\d+)'\]/, "[$1]");