【问题标题】:Regex to match specific format - One capital case word but not two正则表达式匹配特定格式 - 一个大写单词但不是两个
【发布时间】:2016-03-09 08:48:55
【问题描述】:
.+(?<![a-z]\s)([A-Z](?=[a-z'-]+)[a-z'-]+)(?!\s).+\((.+)\).+(?<![a-z]\s)([A-Z](?=[a-z'-]+)[a-z'-]+)(?!\s).+\((.+)\)

案例:

[Nisei](slightly scratched) [Ocellaris](unconcious)
L: 1799 Ocellaris: (slightly scratched) vs. N'isei: (mildly wounded)
[Nisei](slightly scratched) [Zealot Warrior](perfect condition)
L: 1799 Ocellaris: (slightly scratched) vs. zealot warrior: (mildly wounded)
[fire dragon](slightly scratched) [Zealot Warrior](perfect condition)
[King Jheric](slightly scratched) [Zealot Warrior](perfect condition)

1 和 2 应该匹配,但 3 和 6 不应该匹配。他们在 () 之前的部分中有两个词。我尝试使用 (?!\s) 或 (?!\b) 忽略下一个单词,但它似乎只回溯到前一个字符并忽略它。

结果

Case 1:
1: [1,6] Nisei
2: [8,26] slightly scratched
3: [29,38] Ocellaris
4: [40,57] unconcious
Case 2:
1: [8,17] Ocellaris
2: [20,38] slightly scratched
3: [44,50] N'isei
4: [53,67] mildly wounded
Case 3:
1: [1,6] Nisei
2: [8,26] slightly scratched
3: [29,34] Zealo
4: [45,62] perfect condition
Case 4:
No Match
Case 5:
No Match
Case 6:
1: [1,4] Kin
2: [14,32] slightly scratched
3: [35,40] Zealo
4: [51,68] perfect condition

更新:

一般模式是

Person or NPC (condition) Person or NPC (condition)

人只能有一个大写的名字,而一个 NPC 可以有两个不同大小写的名字......国王 Jheric vs wolfen berserker vs zealot Warriors。

它必须是模糊的原因是它必须匹配像

这样的模式
Me:(condition) v Target:(condition) 
Reply:Some Person L:1200 King Jheric:(condition) vs. Target:(condition)
[Me] -> (condition) [wolfen berserker] -> (condition)
Lag: 1200 [zealot warrior](condition) vs. [King Jheric](condition)

更新 2:

(?<![a-z]|(?:\d+))([A-Z](?=[a-z'-]+)(?!.*\s\d+)[a-z'-]+).+\((.+)\).+(?<![a-z]|(?:\d+))([A-Z](?=[a-z'-]+)(?!.*\s\d+)[a-z'-]+).+\((.+)\)

这解决了上面列出的所有情况,包括原始情况,除了第一个或第二个“事物”有两个单词并且其中至少一个是大写的。

【问题讨论】:

  • 对不起,我不明白你在做什么
  • regex101.com/r/nB5jP4/1 - 这是你想要达到的目标吗?
  • 我正在尝试匹配仅是“事物”(条件)“事物”(条件)而不是“大事物”(条件)“大事物”(条件)之类的模式跨度>

标签: regex lookahead lookbehind negative-lookahead negative-lookbehind


【解决方案1】:

根据您的信息,此模式应该可以完成工作:

(?<![a-z'-] )([A-Z][a-z'-]++)[^(A-Z]*\(([^)]+)\)[^A-Z\v]+([A-Z][a-z'-]++)(?!\s[A-Z])[^(A-Z]*\(([^)]+)\)
  • (?&lt;![a-z'-] ) 是一个否定的lookbehind,以确保 wen 不匹配小写字母或 ' 或 - 和一个空格(用于邪恶的 King Jhared)
  • ([A-Z][a-z'-]++) 匹配一个大写字母,后跟小写字母、撇号、连字符——所有格,因此引擎不会尝试后退
  • [^(A-Z]* 匹配任意数量的非左括号和大写字母的字符(King Jhared,你还记得)——如果你想检查的话,也许你可以在这里使用 [: ]*
  • \(([^)]+)\) 匹配一个左括号,一个或多个不是右括号的字符,然后是右括号
  • [^A-Z\v]+ 匹配任何不是大写字母或换行符的字符一次或多次
  • ([A-Z][a-z'-]++) 匹配一个大写字母,后跟小写字母、撇号、连字符——所有格,因此引擎不会尝试后退
  • (?!\s[A-Z]) 是一个前瞻,以确保它后面没有空格和大写字母
  • [^(A-Z]* 匹配任意数量的非左括号和大写字母的字符
  • \(([^)]+)\) 匹配一个左括号,一个或多个不是右括号的字符,然后是右括号

您可以在此处找到包含所有示例的演示:https://regex101.com/r/nB5jP4/2

【讨论】:

  • 您先生,是正则表达式中的神。 :) 谢谢,我刚才将它与一些奇怪的组合进行了对比,并且效果很好。我也没有意识到所有格,这将有助于未来!您的解释令人惊叹,但是我在一方面感到困惑... [^(A-Z]* 这似乎再次匹配 (condition) vs. (dying) ?
  • 它匹配 &gt; 对 - 既没有括号也没有大写字母 - 那为什么不匹配呢?
猜你喜欢
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
  • 2011-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多