用<code>FOO</code>替换_FOO_的JavaScript RegExp

时间:2011-01-28 17:02:08

标签: javascript regex

我在变量中有这个字符串:

var s = 'I have _this_ string inside a variable'; 

我需要一个能产生这个结果的常规表现:

'I have <code>this</code> string inside a variable' 

此外,如果_字符是一个错误的选择,我愿意使用更适合的任何其他字符。

此外,如果使用相同的字符作为左右边界是一个坏主意,我愿意使用不同的字符(如\this/>this<)。


我希望正则表达式只在这种情况下执行:

一个或多个空白字符,
其次是_,
接下来是一个或多个非白色空间或_,
的字符 其次是_,
接下来是一个或多个白色空间字符。

那样:

'foo _bar_ baz' - &gt; 'foo <code>bar</code> baz'
'foo _bar _ baz' - &gt; 'foo _bar _ baz'
'foo _b_ar_ baz' - &gt; 'foo _b_ar_ baz'
'foo _bar baz' - &gt; 'foo _bar baz'

1 个答案:

答案 0 :(得分:6)

应该很简单:

s = s.replace(/_([^_]*)_/g, '<code>$1</code>');

正则表达式很简单:

  • (...) - 捕获群组,因此$1获取下划线之间的内容
  • [^_]* - 一些非下划线的字符。

接下来的问题:很难判断_..._是否是一个好的选择,这在很大程度上取决于您的典型数据。例如,如果代码中常见_,则可能必须将其转义,这会增加复杂性。

<小时/> 下一个应符合您的新规则:

s = s.replace(/(^|\s)_([^_\s]+)_(?!\S)/g, '<code>$1</code>');

这个有点令人困惑。它应该按照你的规则工作(虽然它也可以在字符串的开头/结尾附近工作,你可能没有空格)。这是我们得到的:

  • (^|\s) - 第一组现在是whitespcae,或者是行的开头。 JavaScript不支持lookbehind,因此必须这样做。
  • _
  • ([^_\s]+) - 主要组 - 匹配不是下划线或空格的字符。
  • _
  • (?!\S) - 负向前瞻 - 检查下一个字符是不是(不是空格) - 双重否定是为了使其在字符串结尾之前工作,它可能是(?=\s|$)如果你对此感觉更舒服。

这里的前瞻性的另一个好处是它不会捕获最后的空间。如果您有两个代码字,例如_hello_ _world_,则它们都将被替换。如果我们使用(\s|$),就像单词之前的空格一样,第一个匹配将占用空格,而第二个单词无法匹配。