首页 > 解决方案 > 正则表达式匹配非匹配组

问题描述

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

[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]*

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

我该如何解决?

标签: javaregexregex-groupregex-greedy

解决方案


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

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

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

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


推荐阅读