【问题标题】:Regex before word not starting with specific characters单词之前的正则表达式不以特定字符开头
【发布时间】:2015-06-24 10:05:34
【问题描述】:

我不想匹配特定的单词may|may15,不以特定字符开头x|-|+

交易; Mar15 x May15, 5 MW Base 121,50 TL

例子:

x May15 > WRONG
- May15 > WRONG
+ May15 > WRONG
xMay15  > WRONG
-May15  > WRONG
+May15  > WRONG
May15   > TRUE
May15,  > TRUE
May15 + > FALSE
May15 x > FALSE
etc...

我尝试了以下但匹配:

(?<!-)\b(?![x|\-|\+]\s?)(may|may15)(?!\s[x|\-|\+])\b(?!-)(\s|\,)

演示: https://regex101.com/r/eV3kW3/1

字符是静态的:+ -+

但是单词是动态的,这些都是月份:

jan|jan13|jan-13|ocak 2013|oca 2013|ocak 13|oca 13

feb|feb13|feb-13|şubat 2013|şubt 2013|şubat 13|şub 13

等等。

【问题讨论】:

  • 你运行的是哪种语言?
  • 那么你的预期输出是什么?
  • 我只想“不匹配”。

标签: regex pcre negative-lookahead


【解决方案1】:

这可以通过 PCRE 动词 (*SKIP)(*F) 实现

[-x+]\h*may(?:15)?(*SKIP)(*F)|may(?:15)?

DEMO

首先,[-x+]\h*may(?:15)? 匹配您要排除的所有 may 字符串。然后下面的(*SKIP)(*F) 部分使匹配失败。现在,正则表达式引擎使用| 运算符旁边的模式来匹配字符串剩余部分的字符。 \h* 匹配零个或多个水平空白字符。

更新:

(?:[-x+]\h*may(?:15)?|may(?:15)?\h*[-x+])(*SKIP)(*F)|may(?:15)?

DEMO

【讨论】:

  • 实际上,我很难理解你的代码:)。您的回答很完美,但我的字符是静态的,而文字是动态的。我怎样才能实现这些话? may|may15 只是一个示例。现在用文字更新问题。
  • @Bora 你实际上在你的正则表达式中使用了may15, may 字符串。这就是为什么我想出上面使用may 子字符串的原因。您对更新后的预期输出是什么?请尝试在ver首先提出确切的问题。
  • 你可以看看吗? regex101.com/r/uY9mB3/2 例如jul|jul-15 字。我们设置了-+x 不跟在单词后面的字符。但是jul-15- 符号。虽然词是真的,但它不匹配。谢谢
  • 根据您的回答,我必须定义整个单词,例如jul(?:[-+x]15)。我用另一种方式解决了这个问题,谢谢。
【解决方案2】:
[x+-]\s*(?:may15|may)\K|(?:may15|may)\s*[x+-]\K|(?:may15|may)

试试这个。查看演示。

https://regex101.com/r/sJ9gM7/127

【讨论】:

  • 您的模式效果很好,感谢您的帮助.. @AvinashRaj 对我来说最好的回答;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
  • 1970-01-01
  • 2020-06-03
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
相关资源
最近更新 更多