我在变量中有这个字符串:
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'
答案 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|$)
,就像单词之前的空格一样,第一个匹配将占用空格,而第二个单词无法匹配。