我正在尝试找到正确的正则表达式,但没有任何方法可以完全按照我的预期进行。
在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
我尝试了很多其他表达但没有任何作用。 如果有人能帮助我,我将非常感激。
非常感谢。
答案 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)
答案 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)+$", '')