【问题标题】:Regex matches non-matching group正则表达式匹配非匹配组
【发布时间】:2019-01-13 23:13:04
【问题描述】:

我想匹配全名中的一些名称,即名称+某些信息,例如发布年份或作者。 我想在 fullName 中获取 realName。

[author1] Shuu [Digital]
[author1] Paradise ~★  Special Edition
 (magazin) [kulmov_ (Kurowa)] Channel (Fate/Grand Order) [Chinese] [*'N]
(COMIC1☆7) [ComicCon] X-Men!! (Marvel)
(magazin) [Rave (Jacky)] SPLASH 11 (Microsoft)
[anotherauthor] name1 | name2 (Hatsujou Complex) [English]
[author7 (aurhot234)] Connect (Project) [Digital]
[author3] ~Hellverse~ (COMICcon 2017)
[author4] Escape [English] [Decensored]

我发现该名称几乎总是在“]”或“)”之后。然后是一个空格,然后是名称。名称后面是一个空格,或者什么都没有,或者是“(”或“[”。 名称可以包含一些非 ASCII 吗?符号。全名可以包含日本符号。

我找到了:

]\s+(.+)+\s*[\(|\[|\s]*

我不知道为什么,但它确实与“]”匹配,直到字符串的最后,包括空格。 但正如我所见,它应该只匹配“]”之后的所有内容,获取真实姓名,然后在找到“(”或“[”后停止。

我该如何解决这个问题?

【问题讨论】:

  • 请显示您期望的结果。
  • .+ 将匹配字符串末尾的所有内容,而模式的其余部分不必匹配任何内容,因为它们有 * 量词。
  • (.+)+ 的目的是什么?外部/最后一个+ 只会触发一次,因为内部/第一个+ 已经抓住了一切。

标签: java regex regex-group regex-greedy


【解决方案1】:

我不知道为什么,但它确实与“]”匹配,直到字符串的最后,包括空格。但正如我所见,它应该只匹配“]”之后的所有内容,获取真实姓名,然后在找到“(”或“[”后停止。

如果您希望它在看到 ( 或 [ 时停止,但没有有是一个或者可能不止一个,那么你需要更多对你匹配的东西很挑剔。 .+ 将匹配任何字符序列((.+)+ 中的第二个 + 是多余的),并且可以包括 ( 和 [ 字符。这样的事情会更好:

]\s+([^[(]+)

在那里,捕获组不能包含任何[ 或( 字符,所以如果有,那么匹配必然会在之前停止。

【讨论】:

  • 与my answer 的结果相同,但它捕获尾随空格。
【解决方案2】:

我想你可能正在寻找这个正则表达式:

]\s+([^([\s]+(?:\s+[^([\s]+)*)

请参阅regex101.com 进行演示。结果是:

Shuu
Paradise ~★  Special Edition
Channel
X-Men!!
SPLASH 11
name1 | name2
Connect
~Hellverse~
Escape

解释

]\s+             Match lead-in, i.e. end-bracket and some spaces
(                Start capture group:
  [^([\s]+         Match anything except '(', '[', and spaces
  (?:              Start optional repeating group:
    \s+              Match one or more spaces
    [^([\s]+         Match anything except '(', '[', and spaces
  )*               End of repeating group
)                End of capture group

【讨论】:

  • 似乎是正确的。还是得检查一下。但是为什么它会在第一个是“]”的情况下创建两个匹配组?
  • @EsoMoa 它将始终捕获整个“匹配”,作为组 0。任何 (xxx) 捕获组然后按照正则表达式中的顺序编号为 1 或更高。在您的代码中,您将调用 group(1) 以获取捕获组中的文本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多