匹配特定格式的正则表达式 - 一个大写单词而不是两个
Regex to match specific format - One capital case word but not two
.+(?<![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 可以有两个不同大小写的名字...King Jheric vs wolfen berserker vs zealot warrior.
它必须含糊的原因是它必须匹配像
这样的模式
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'-]+).+\((.+)\)
这解决了上面列出的所有情况,包括原始情况,但第一个或第二个 "thing" 有两个单词并且其中至少一个大写的情况除外。
根据您的信息,此模式应该可以完成工作:
(?<![a-z'-] )([A-Z][a-z'-]++)[^(A-Z]*\(([^)]+)\)[^A-Z\v]+([A-Z][a-z'-]++)(?!\s[A-Z])[^(A-Z]*\(([^)]+)\)
(?<![a-z'-] )
是一个负向后视,以确保 wen 不匹配小写字母或 ' 或 - 和 space(对于邪恶的国王贾里德)
([A-Z][a-z'-]++)
匹配大写字母后跟小写字母、撇号、连字符 - 所有格,因此引擎不会尝试后退
[^(A-Z]*
匹配任意数量的非左括号和大写字母的字符(King Jhared,你记得)——也许你可以在这里使用 [: ]*
,如果你想检查
\(([^)]+)\)
匹配左括号,一个或多个不是右括号的字符,然后是右括号
[^A-Z\v]+
匹配任何不是大写字母或换行符的字符一次或多次
([A-Z][a-z'-]++)
匹配大写字母后跟小写字母、撇号、连字符 - 所有格,因此引擎不会尝试后退
(?!\s[A-Z])
是前瞻性的,以确保它后面没有 space 和大写字母
[^(A-Z]*
匹配任意数量的不是左括号和大写字母的字符
\(([^)]+)\)
匹配左括号,一个或多个不是右括号的字符,然后是右括号
您可以在此处找到包含所有样本的演示:https://regex101.com/r/nB5jP4/2
.+(?<![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 可以有两个不同大小写的名字...King Jheric vs wolfen berserker vs zealot warrior.
它必须含糊的原因是它必须匹配像
这样的模式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'-]+).+\((.+)\)
这解决了上面列出的所有情况,包括原始情况,但第一个或第二个 "thing" 有两个单词并且其中至少一个大写的情况除外。
根据您的信息,此模式应该可以完成工作:
(?<![a-z'-] )([A-Z][a-z'-]++)[^(A-Z]*\(([^)]+)\)[^A-Z\v]+([A-Z][a-z'-]++)(?!\s[A-Z])[^(A-Z]*\(([^)]+)\)
(?<![a-z'-] )
是一个负向后视,以确保 wen 不匹配小写字母或 ' 或 - 和 space(对于邪恶的国王贾里德)([A-Z][a-z'-]++)
匹配大写字母后跟小写字母、撇号、连字符 - 所有格,因此引擎不会尝试后退[^(A-Z]*
匹配任意数量的非左括号和大写字母的字符(King Jhared,你记得)——也许你可以在这里使用[: ]*
,如果你想检查\(([^)]+)\)
匹配左括号,一个或多个不是右括号的字符,然后是右括号[^A-Z\v]+
匹配任何不是大写字母或换行符的字符一次或多次([A-Z][a-z'-]++)
匹配大写字母后跟小写字母、撇号、连字符 - 所有格,因此引擎不会尝试后退(?!\s[A-Z])
是前瞻性的,以确保它后面没有 space 和大写字母[^(A-Z]*
匹配任意数量的不是左括号和大写字母的字符\(([^)]+)\)
匹配左括号,一个或多个不是右括号的字符,然后是右括号
您可以在此处找到包含所有样本的演示:https://regex101.com/r/nB5jP4/2