[英]Java Regular Expression contains search
我在Java中有應用程序,用戶將使用特定格式的文件名給文件。 例如: james-fcanada-csmith-l.txt ,
其中-f是名字的指示符,-c是國家的指示符,-l是姓氏的指示符。
為此,我創建了此RegEx ([\\w\\d\\s].*)-f([\\w\\d\\s].*)-c([\\w\\d\\s].*)-l
它工作正常。
但是,如果用戶更改字段順序,例如smith-ljames-fcanada-c.txt (首先添加姓氏) ,則此RegEx無法正常工作。
請建議如何使用RegEx達到這種要求。
另外,請告訴我是否還有其他更好的方法可以實現這一目標。
解決問題的一種簡單方法可能是擁有三個單獨的正則表達式,一個又一個地運行。
對於-f,請使用以下命令:
^([^-]*-[^f])*([^-]*?)-f([^-]*-[^f])*\..*$
另一個更復雜的解決方案可能是使用諸如antlr
類的解析器進行的,對於此用例而言,該解決方案可能過於復雜。
您可以使用Positive Lookahead
(我想這就是它的名字)。
(?=([\w\d\s].*)-f)(?=([\w\d\s].*)-c)(?=([\w\d\s].*)-l)
這將以任何順序匹配字符串。
我不會用一個正則表達式來做到這一點。 但是,如果您堅持:
(\w+)-([fcl])(\w+)-(?!\2)([fcl])(\w+)-(?!\2|\4)([fcl])
說明:
(\\w+)
代替([\\w\\d\\s].*)
,在這種情況下似乎可以完成任務。 您可以還原它,但仍然可以獲得正確的結果。 Btw \\w
包含\\d
。 ([fcl])
的任何一個,然后在第二個破折號出現的時候,我們使用負前瞻來匹配第一個不存在的匹配字符,然后再次使用三個中的任何一個- (?!\\2)([fcl])
,對於最終匹配,我們匹配第一個或第二個匹配字符的不存在,然后匹配三個- (?!\\2|\\4)([fcl])
。 |
。 這是Java轉義的版本:
(\\w+)-([fcl])(\\w+)-(?!\\2)([fcl])(\\w+)-(?!\\2|\\4)([fcl])
為canada-csmith-ljames-f.txt
運行此程序后,您將獲得:
canada
,第二組= c
smith
,第四組= l
james
,第六組= f
使用String.split()
將參數拆分為字段,然后可以遍歷這些字段以獲取值:
String[] args = filename.split('-');
for (String arg : args)
{
if (arg.startsWith("f")
{
firstName = arg;
}
else if (arg.startsWith("c")...
}
使用此選項,您的參數可以在文件名中以任意順序出現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.