用于忽略自定义转义字符的正则表达式模式

Posted

技术标签:

【中文标题】用于忽略自定义转义字符的正则表达式模式【英文标题】:Regex Pattern for ignoring a custom escape character 【发布时间】:2012-09-09 19:38:36 【问题描述】:

我正在尝试找到一个合适的正则表达式来匹配输入字符串中的一对自定义字符。这些自定义字符被其对应的 html 标签替换。

例如 输入字符串可以有成对的下划线来表示粗体字。因此, _Name_ 输出为 <b>Name</b>

但是,如果字符串中有真正的下划线,则不能用“粗体”标签替换,必须忽略。真正的下划线必须以/ 开头(我找不到更好的字符,它可能是另一个下划线或连字符或其他字符)。 正则表达式必须忽略此真正下划线的任何单个或成对出现。

到目前为止,我可以想出这个正则表达式:

var pattern = @"(?!/)_(.*?)(?!/)_";

但它在以下输入字符串中失败:

_Tom_Katy/_Richard/_/_Stephan_and many users

输出为

<b>Tom</b>Katy/<b>Richard/_/</b>Stephan_and many users

非常感谢您, 推荐

【问题讨论】:

您的第一个 (?!/) 应该是后视,而不是前瞻 @Gabber:第二个也应该向后看。 后视不是在整个正则表达式之前搜索吗? 问题不完整..您应该指定valid 输出和invalid 输出..这将有助于其他人理解您的问题! @AlanMoore 现在明白了,感谢您的建议编辑了我的答案 :) 【参考方案1】:

试试这个

@"(?<!/)_([^/]+?)[^/]_"

这会找到其中没有/ 的任何字符序列,如果您想在搜索中包含/,请尝试这种方式

@"(?<!\/)_(.+?)((?<!\/)_)"

解释:

(?<!/)      # this is a negative lookbehind, it says "I don't want the previous char to be /
_           # finds the first _
([^/]+?)   # tells to search characters without / (in this case your names)
[^/]_"      # finds the last _ not preceded by / (maybe redundant seen the previous one)

【讨论】:

(.*?) 直到使用前导下划线后才会起作用,所以这不是问题。但是无论如何切换到(.+?) 可能是个好主意。否则__(两个连续的下划线)将转换为&lt;b&gt;&lt;/b&gt; 谢谢一百万.. 两者都试过了,效果很好..我仍然无法理解这个正则表达式背后的逻辑。有帮助的链接吗?字符“ 好吧,再次感谢 Gabber,:)

以上是关于用于忽略自定义转义字符的正则表达式模式的主要内容,如果未能解决你的问题,请参考以下文章

了解下C# 正则表达式

C#?正则表达式

C#--正则表达式

JS的正则表达式

正则表达式 - 获取引号中的字符串忽略转义的引号和评论

用于匹配单词的 javascript 正则表达式模式,具有自定义单词边界