查找前面没有后跟的正则表达式

时间:2014-07-29 03:45:38

标签: java regex string expression

我正在尝试找到正确的正则表达式,但没有任何方法可以完全按照我的预期进行。

在Java中我使用String的函数split(String regex)。 我有一个字符串列表(实际上是音乐专辑的名称)。 我想要的是通过字符' - '分割字符串,并仅使用结果数组的前两个字符串。

例如,我有以下字符串:

Beyonce-BDay-2006-RNS
Big_Sean-Finally_Famous-2011-CR
Black_Eyed_Peas-The_E.N.D-2009-H3X
Bob_Sinclar-Soundz_Of_Freedom-CD-2007-OBC
Britney_Spears-Femme_Fatale-2011-H3X
Chris_Brown-F.A.M.E.-2011-H3X
David_Guetta_-_One_Love-2009-MOD
Jay-Z-Blueprint_2.1-2003-RNS
Jennifer_Lopez-Love-2011-CaHeSo
Kanye_West-808s_And_Heartbreaks-2008-H3X
Katy_Perry-Teenage_Dream-2010-CR
Ne-Yo-Year_Of_The_Gentleman-2008-FLM
Pitbull-Rebelution-2009-NOiR

我使用以下代码:

for (int i = 0; i < strings.length; i++) {
    str = strings[i];
    String[] parts = str.split("-");
    System.out.println(parts[0].replace('_', ' ').trim() + " - " + parts[1].replace('_', ' ').trim());
}

结果我得到了:

Beyonce - BDay
Big Sean - Finally Famous
Black Eyed Peas - The E.N.D
Bob Sinclar - Soundz Of Freedom
Britney Spears - Femme Fatale
Chris Brown - F.A.M.E.
David Guetta - One Love
Jay - Z
Jennifer Lopez - Love
Kanye West - 808s And Heartbreaks
Katy Perry - Teenage Dream
Ne - Yo
Pitbull - Rebelution

除了两个字符串外,一切都很好:

Jay-Z-Blueprint_2.1-2003-RNS
Ne-Yo-Year_Of_The_Gentleman-2008-FLM

问题在于,第一个连字符(' - ')当然是艺术家名字的一部分。

因此,我的正则表达式必须是其他将排除这些异常的东西。 我试过这个正则表达式:

(?<!Jay)(?<!Ne)(?!Z)(?!Yo)-

哪个工作正常,但如果我将以下字符串添加到列表中:

Jay-Good-1996-RNS
Ne-Alright-2000-RNS

我明白了:

Jay-Good - 1996
Ne-Alright - 2000

而不是:

Jay - Good
Ne - Alright

我尝试了很多其他表达但没有任何作用。 如果有人能帮助我,我将非常感激。

非常感谢。

5 个答案:

答案 0 :(得分:1)

你根本做不到!

即使您可以使用正则表达式来分割字符串:

Ne-Yo-Year_Of_The_Gentleman-2008-FLM

到今年为止,并获得以下内容:

Ne-Yo-Year_Of_The_Gentleman

现在你将如何决定哪个是名字,哪个是最后一个?

选项:
名字:Ne
姓氏:Yo-Year_Of_The_Gentleman

名字:Ne-Yo
姓氏:Year_Of_The_Gentleman

并且没有办法确定哪个是&#34;正确&#34;输出!

答案 1 :(得分:0)

要为拆分分隔符创建例外,您可以使用如下的外观:

(?<!Jay|Ne)-(?!Z|Yo)

RegEx Demo

答案 2 :(得分:0)

  import re
  print re.sub(r"-\d{4}.*","",x)

在python中试过这个。它运行正常。

答案 3 :(得分:-2)

您可以使用此正则表达式进行替换:(-CD)?-[0-9]{4}-([a-zA-Z0-9]+)$ - http://regex101.com/r/vN2uH2/1

考虑所有字符串以&#34; -YEAR-NAME&#34;结束,其中YEAR取4个数字,NAME取任何一个或多个字符,包括数字,并且可以由&#34; -CD&#34;

以下是您可以尝试的其他内容:^[^-]+(-[a-zA-Z]{1,3})?-[^-]+ - http://regex101.com/r/eL6jW2/1

答案 4 :(得分:-2)

这应该是您首先运行的替换模式。因此,我们剥离到行匹配破折号年(4位)破折号字符(数字和字母)的末尾。之后你可以用空格替换'_'而不用担心破折号。

replace("-(\\d){4}-(\\w)+$", '')