Java Regex以查找电影名称

Java Regex以查找电影名称,java,regex,Java,Regex,我正在尝试使用REGEX,它可以将一个视频文件名分组,这样我就可以只提取一个名称,然后用它来解析一些web之类的东西 一部电影的名字几乎(嗯,我想这可能是个问题,因为它可能并不总是)首先是名字,然后是一些随机的字母、数字等等 例如: Batman.v.Superman.Dawn.of.Justice.2016.BLABLABLA-XDAWEFFF 所以它就像 (Batman.v.Superman.Dawn.of.Justice)(rest of the file) 然后我可以提取第一组,用空

我正在尝试使用REGEX,它可以将一个视频文件名分组,这样我就可以只提取一个名称,然后用它来解析一些web之类的东西

一部电影的名字几乎(嗯,我想这可能是个问题,因为它可能并不总是)首先是名字,然后是一些随机的字母、数字等等

例如:

Batman.v.Superman.Dawn.of.Justice.2016.BLABLABLA-XDAWEFFF
所以它就像

(Batman.v.Superman.Dawn.of.Justice)(rest of the file)
然后我可以提取第一组,用空格替换点,我就可以开始了

另一个例子:

Eye.in.the.Sky.2015.1080p.BluRay
String[] s = "Batman.v.Superman.Dawn.of.Justice|2016.BLABLABLA-XDAWEFFF".split("|");
进入:


你们有什么正则表达式吗?我不知道如何将它们分开,因为名称后面可能有任何单词、数字等。

如果您的字符串没有任何可以通过正则表达式定义的指定形式,则不可能做到这一点

电影的问题是它们的名字可以包含任何东西

要解决此问题,可以使用一些分隔符来确定保存时名称的结尾位置:

Batman.v.Superman.Dawn.of.Justice|2016.BLABLABLA-XDAWEFFF
然后您可以使用例如:

Eye.in.the.Sky.2015.1080p.BluRay
String[] s = "Batman.v.Superman.Dawn.of.Justice|2016.BLABLABLA-XDAWEFFF".split("|");

你最好的猜测是这样的

([ .\w']+?)(\W\d{4}\W?.*)
但是正如评论中提到的,由于电影标题没有标准,而且你的命名惯例也没有,所以这并不总是有效的

这就是它的作用,一步一步:

([.\w']+?)

  • [.\w']
    任何字符,如空格、点、a-z、a-z、0-9、u和'

  • +?
    捕获根据需要有许多字符,直到表达式的第二部分

(\W\d{4}\W.*)

  • \W
    任何不是a-z,a-z,0-9_
  • \d{4}
    四个数字0-9
  • \W
    任何不是a-z,a-z,0-9_
  • *
    字符串结束前的任何内容

电影标题没有标准。例如,电影《2012年密码》的预期行为是什么?字符串是否为
2012.2009.blabla-XDAWEFFF
?如果你只想在第一次出现4个数字的时候停下来,这不会太难,但是准确度也会下降。也许你可以把这个
(Eye.in.the.Sky)
分割成
?。你应该得到数组中的所有部分。@chris85好的,请看。也许在一年中的第二个点开始时用20xx格式找到的正则表达式在大多数情况下都会起作用。@chris85好吧,电影名称只是数字的情况并不多,所以我可以接受。你能帮我弄一下在前4个数字出现时停止的正则表达式吗?我对regex有点陌生,有点问题。可能是
(.+?)\d{4}
。捕获组1将是您的“标题”(如果java不支持,可能是
[0-9]
而不是
\d
)。。或者在句点上分解/拆分并迭代返回,直到有一个4位数的字段。您能告诉我如何在第一组中添加空格吗?所以它匹配例如:Black Mass 2015 1080p?我试图将\s添加到第一个组中,但效果不是很好……这样:
([\.\w']+?)
,但是如果您想替换来自的分隔符。到一个空间,那是行不通的。生成表达式时希望使用
作为分隔符。这将是一个带有空格的版本<代码>([\s\w']+?)(\s[0-9]{4}\s.*)而不是。只是在regex101上尝试了它,但不起作用。它根本不把那个名字和那个空白区分组。你能自己检查一下吗?注意
不需要在字符类中转义。@chris85我想我找到了正确的一个:([\.\w']+?)(\w?[0-9]{4}.?*)。用于\W以便日期可以用(、甚至空格包围。