正则表达式检查单词是在句子中还是在外面

时间:2014-06-10 18:19:55

标签: javascript regex

我有正则表达式文本替换搜索/\*\[(.*?)\]\*/ig模式并将其替换为'<span style="font-size: 14px;">$1</span>'。这适用于简单的javascript 替换功能。

text = text.replace(/\*\[(.*?)\]\*/ig, '<span style="font-size: 14px;">$1</span>');

但是,我想知道模式是否在句子内,并相应地设置字体大小。

情景句1:

This is a text with the *[pattern]* inside the sentence.

此处*[pattern]*应替换为'<span style="font-size: 14px;">$1</span>'。请注意,字体大小为14px,因为模式位于句子内。以下情况也是如此:

*[pattern]* in the beginning.

End with a *[pattern]*

然而,在以下场景中模式不在句子中,我希望字体大小更大,让我们说30px。这适用于以下情况:

*[pattern]*

Text and then the pattern in the new line
*[pattern]*

 *[pattern]* 

这里第3个用空格表示,但没有其他词。

基本上,如果模式与句子隔离,我希望它具有更大的字体大小。有什么建议吗?

2 个答案:

答案 0 :(得分:4)

您可以使用这样的前瞻:

/\*\[(.*?)\]\*(?=[^.\n]*\.)/g

用于“内部”句子的模式。同样,

/\*\[(.*?)\]\*(?=[^.\n]*(\n|$))/g

表示“外部”。

http://jsfiddle.net/RCD83/

答案 1 :(得分:0)

使用单个正则表达式可以轻松实现此目的。我们将使用捕获组。

不要让长度吓到你:这只是模式,被两个(?:non-capturing groups)包围

^(?:([ \t]*?)|([^\r\n]*?))\*\[[^\]]*\]\*(?:([ \t]*?)|([^\r\n]*?))$
  1. 捕获组1是*[pattern]*之前的部分,当它包含的不仅仅是空格或制表符时。
  2. 捕获组2是*[pattern]*之后的部分,当它包含的不仅仅是空格或制表符时。
  3. 在此demo for the regex中,查看右下方窗格中的捕获组。

    如何使用?

    在替换lambda中,只测试第1组和第2组的长度。如果它大于零,则进行一种替换。否则,做另一个。

    我不会为你编写代码,但这里有替换lambda的样子:

    replaced = subject.replace(regex, function(m, group1, group2) {
        if ( group1 or group2 meet some magic code... ) return some span around m;
        else return some other span around m;;
    });