簡體   English   中英

Java正則表達式包含搜索

[英]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])*\..*$

http://regexr.com/3bab0

另一個更復雜的解決方案可能是使用諸如antlr類的解析器進行的,對於此用例而言,該解決方案可能過於復雜。

我建議您使用正則表達式交替運算符|

"([\\w\\d\\s][^-\n]*)-f|([\\w\\d\\s][^-\n]*)-c|([\\w\\d\\s][^-\n]*)-l"

DEMO

您可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM