我对正则表达式很糟糕,但是我尝试了一下谷歌(甚至看过reddit的来源)我仍然卡住了,所以这里:
我的目标是匹配以下“代码”并将其替换为HTML代码。这只是我坚持使用的正则表达式。
**bold text**
_italic text_
~hyperlink~
这是我对大胆的尝试:
^\*\*([.^\*]+)\*\*$
为什么这不起作用?我正在使用preg语法。
答案 0 :(得分:4)
使用:
\*\*(.[^*]*)\*\*
说明:
\*\* // match two *'s
(. // match any character
[^*] // that is not a *
*) // continuation of any character
\*\* // match two *'s
在一个字符类“[]”中,“^”只有在它是第一个字符时才有意义。所以(.*)
匹配任何内容,(.[^*]*)
匹配任何内容直到文字*
编辑:为了回复与星号匹配的评论(即**bold *text**
),您必须使用非贪婪的匹配:
\*\*(.*?)\*\*
字符类是更有效的非贪婪匹配,但不可能在字符类(see“括号和反向引用...”中进行分组。)
答案 1 :(得分:3)
首先,摆脱^和$。使用它们只匹配以**开头并以**结尾的字符串。其次,使用贪婪量词来匹配尽可能少的文本,而不是为星号以外的所有字符创建一个字符类。
这是我的建议:
\*\*(.+?)\*\*
答案 2 :(得分:2)
这是另一个正则表达式:\*\*((?:[^*]|\*(?!\*))*)\*\*
Perl中的示例:
my %tag2re = (b => <<'RE_BOLD', i => '_([^_]*)_');
\*\*( # begin bold
(?:[^*] # non-star
| # or
\*(?!\*) # single star
)* # zero or more times
)\*\* # end bold
RE_BOLD
my $text = <<BBCODE;
before **bold and _italic_ *text
2nd line** after _just
italic_
****
**tag _soup** as a result_
BBCODE
while (my ($tag, $re) = each %tag2re) {
$text =~ s~$re~<$tag>$1</$tag>~gsx;
}
print $text;
打印:
before <b>bold and <i>italic</i> *text 2nd line</b> after <i>just italic</i> <b></b> <b>tag <i>soup</b> as a result</i>
或者作为html:
before bold and italic *text 2nd line after just italic tag soup as a result
Stackoverflow的解释是:
在粗体和斜体 *文字之前之后的第二行
斜体标记汤
答案 3 :(得分:1)
\*\*(.*?)\*\*
适用于粗体文字。
只需将**替换为_或〜替换其他