正则表达式:如果模式以/开头,则不匹配

时间:2019-01-07 09:01:33

标签: regex pcre regex-lookarounds

我的正则表达式(PCRE):

MarshalAs(UnmanagedType.LPStr)]

是一个匹配项(实际匹配项被星号包围):

\b([\w-.]*error)\b(?:[^-\/.]|\.\W|\.$|$)

不匹配:

**this.is.an.error**  
**this.IsAnerror**  
**this.is.an.error**.  
**this.is.an.error**(  
bla **this_is-an-error**  
**this.is.an.error**:  
this is an (**error**)  

对于此示例:this.is.an.error.but.dont.match this.is.an.error-but.dont.match this.is.an.error/but.dont.match this.is.an.error/ /this.is.an.error 如果以字符/this.is.an.error开头,我将无法拒绝所有匹配。 我尝试过的每种组合都会导致部分捕获(这不是期望的)。

有没有简单或花哨的方法来做到这一点?

2 个答案:

答案 0 :(得分:1)

您可以尝试在开头而不是单词边界处添加lookabehinds:

(?<!\/)(?<=[^\w-.])([\w-.]*error)\b(?:[^-\/.]|\.\W|\.$|$)

说明:

  • (?<!\/)-向后寻找否定字符,以确保第一个字符之前没有/
  • (?<=[^\w-.])-考虑到您为单词[\w-.]所接受的字符的扩展定义,单词边界的实现;

Demo

答案 1 :(得分:1)

\/.*|添加正则表达式:

\/.*|\b([\w-.]*error)\b(?=[^-\/.]|(?:\.\W?)?$)

现在,就像第一个捕获组拥有所需部分之前一样。

请参见live demo here

注意:我对您的正则表达式进行了一些修改,以删除不必要的更改。