2

我正在为字符串而苦苦挣扎:

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

试图在 [] 中引用除数字之外的每个值,因此可以将其转换为

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

谢谢。

4

5 回答 5

4

你需要一个正则表达式

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

您可以使用字符类否定前瞻断言来解决此问题:

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 ]
于 2013-06-24T08:39:00.563 回答
0

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

  • \[只是一个简单的匹配[,由于 的特殊含义,它必须被转义[
  • \d*?将匹配任意数量的数字(或不匹配),但尽可能少以完成匹配。
  • [a-z]将匹配给定范围内的任何字符。
  • \w*?将匹配任何“单词”(字母数字)字符(字母、数字和下划线),再次尽可能少地完成匹配。
  • ]是另一个简单的匹配,这个不必被转义,因为它不会误导([在这个级别没有打开)。它可以被转义,但这通常是一种风格偏好(取决于实际的正则表达式引擎)。
于 2013-06-24T08:37:39.137 回答
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]
于 2013-06-24T08:40:57.573 回答
0

你可以用这个正则表达式替换它

input.replace(/(?!\d+\])(\w+)(?=\])/g, "'$1'");
于 2013-06-24T08:50:08.263 回答
0

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

str.split('[').join("['").split(']').join("']").replace(/\['(\d+)'\]/, "[$1]");
于 2013-06-24T09:00:02.703 回答