我对regex很新,并试图找出一个只与我的自定义标记内的单词实例匹配的模式。
在下面的示例中,两个单词都匹配在|之后的条件在一个]之前
Pattern: (?=|)singleline(?=.*])
Sample: [if @sample|singleline second] <p>Another statement singleline goes here</p> [/if]
答案 0 :(得分:2)
与|之后的条件匹配的单词在一个]之前
.*
,这意味着“任何东西,零次或多次,并且对它贪婪”,将竞争到字符串的末尾并且只备份到足以达到一个]
(最后一个)。 (你的后视是一个先行):
如果你真的想要匹配你想要匹配的东西(见报价),那就是它:
Pattern: (?<=|)(\w+)(?=])
编辑:或者如果您想要“匹配字母数字和空格内的|和] ”:
Pattern: (?<=|)([\w\s]+?)(?=])
答案 1 :(得分:1)
(?=|)
断言字符串中的下一个东西是什么都没有。这将始终评估为true
;它总是可以匹配任何东西。我认为sweaver2112是正确的,你打算在那里使用lookbehind,但你还需要逃避管道:(?<=\|)
。或者只是按正常方式匹配管道;我认为没有必要使用该部分的外观。
另一部分可能需要做一个先行,但你需要扩展一下。你想断言这个词后跟一个右括号,但是如果先有一个左括号则不然。假设括号总是正确配对,那应该意味着这个词在它们之间。像这样:
Pattern: \|singleline(?=[^\]\[]*\])
[^\]\[]*\]
匹配除]
或[
之外的任何字符中的零个或多个,后跟]
。根据正则表达式的风格,逃避“真正”括号的反斜杠可能是必要的,也可能不是必需的,但是逃避它们总是安全的。