【问题标题】:Regex: don't match if the pattern start with /正则表达式:如果模式以 / 开头,则不匹配
【发布时间】:2019-06-01 22:21:31
【问题描述】:

我的正则表达式(PCRE):

\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 如果它以字符/ 开头,我无法设置拒绝整个匹配的条件。 我尝试过的每一种组合都导致了一些部分捕获(这不是我们想要的)。

有什么简单或奇特的方法可以做到这一点吗?

【问题讨论】:

  • 你在什么语言或环境中实现这个正则表达式?
  • 该正则表达式应该匹配什么?

标签: regex pcre regex-lookarounds


【解决方案1】:

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

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

解释:

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

Demo

【讨论】:

    【解决方案2】:

    在你的正则表达式前面加上\/.*|:

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

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

    live demo here

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

    【讨论】:

    • 它也不会匹配一些合法的短语,比如:/this.is.an.error
    • 你也没有谈到那种模式。
    猜你喜欢
    • 2013-11-23
    • 2023-03-17
    • 2013-03-18
    • 2015-07-06
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多