我在变量中有这个字符串:
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'
应该很简单:
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|$),就像单词之前的空格一样,第一个匹配将占用空间,而第二个单词无法匹配.
| 归档时间: |
|
| 查看次数: |
99 次 |
| 最近记录: |