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

Šim*_*das 1 javascript regex

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

var s = 'I have _this_ string inside a variable'; 
Run Code Online (Sandbox Code Playgroud)

我需要一个定期的epxression来产生这个结果:

'I have <code>this</code> string inside a variable' 
Run Code Online (Sandbox Code Playgroud)

此外,如果_角色是一个糟糕的选择,我愿意使用更适合的任何其他角色.

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


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

一个或多个空白字符,
其次是_,
其次是一个或多个charaters不属于空白或_,
其次是_,
后面跟着一个或多个白色空格字符.

以便:

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

Kob*_*obi 6

应该很简单:

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

正则表达式很简单:

  • (...)- 捕获组,所以$1采用下划线之间的内容
  • [^_]* - 一些不是下划线的字符.

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


下一个应该适合您的新规则:

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

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

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

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