2013-05-18 238 views
1

我的String看起來像這樣:"/namestart blabla1 /nameend blabla2"。 PS。例如,它也可能是/namestartblabla1/nameendbababa2將字符串分爲兩部分

我需要那些爲兩個字符串:

string1 == blabla1 
string2 == blabla2 

我得到了我的琴絃是這樣的:

if(mystring.startsWith("/namestart")){ 
    Pattern p = Pattern.compile("/namestart(.*?)/nameend"); 
    Matcher m = p.matcher(mystring); 
    if (m.find()) { 
     String string1 = m.group(1); 
     String string2 = mystring.substring(mystring.indexOf("/nameend")+8, mystring.length())); 
    } 
} 

第一個問題是可以在更好的完成或者是這個解決方案可以嗎?

第二個問題是,blabla1和blabla2可以是任何東西,它甚至可以是/ nameend(probaby不會),或者會導致我reg表達式的東西。那會是什麼理論解決方案?

+0

這些字符串從哪裏來? – jlordo

+0

你的字符串總是格式爲'/ namestart'blabla1'/ nameend'blabla2?你還提到'blabla1'和'blabla2'甚至可以是'/ nameend'。你對這種情況的期望是什麼? – Pshemo

回答

2

我不知道你正在嘗試做的,但也許嘗試使用groups索引而不是substring。要擺脫if(mystring.startsWith("/namestart")){,您還可以在您的正則表達式的星號處使用^錨點來指示匹配部分也應放置在字符串的開頭。

String mystring = "/namestart blabla1 /nameend blabla2"; 

Pattern p = Pattern.compile("^(/namestart)(.*?)(/nameend)(.*)"); 
Matcher m = p.matcher(mystring); 
if (m.find()) { 
    String string1 = m.group(2); 
    String string2 = m.group(4); 
    System.out.println(string1 + "|" + string2); 
} 

blabla1 | blabla2 

還取決於你試圖形勢,實現地方blabla1blabla2會是什麼輸出/nameend你可以嘗試改變(.*?)(.+?)

+0

謝謝,我認爲多數民衆贊成什麼尋找。 我可以請你向我解釋這個表達式: 「^(/ namestart)(。*?)(/ nameend)(。*)」 以及用(。+?)替換是什麼意思? – user1985273

+0

'。*?'和'。+?'完全等同於'。*'。它們全都匹配任何字符串。 – NovaDenizen

+0

@ user1985273你可以說正則表達式的哪一部分不清楚嗎?我可以看到,在你的問題中,你使用了組「(...)'和不情願的量詞'(。*?)',所以我不確定哪部分對你來說是新的。 – Pshemo

1

如果字符串的格式始終如下,

String Str = new String("/namestart blabla1 /nameend blabla2"); 

然後將下面的代碼可能就足夠了,

 for (String temp: Str.split(" ", 4)){ 
     System.out.println(temp); 
     } 
+0

對不起,沒有提及它也可能是/ namestartblabla1/nameendbababa2例如。 – user1985273

1

你可以看看下面的代碼爲您的解決方案

public class StackOverflow { 
    public static void main(String[] args) { 

     String mystring = "/namestart hello /nameend test"; 

     if(mystring.startsWith("/namestart") && mystring.contains("/nameend")){ 
     System.out.println("String 1: " + mystring.substring(10, mystring.lastIndexOf("/nameend")).trim()); 
     System.out.println("String 2: " + mystring.substring(mystring.lastIndexOf("/nameend") + 8).trim()); 
     } 

    } 
} 

我們必須假設,最後「/ nameend」將是姓氏的關鍵,因爲我可以看到的MyString可以「/ namestartblabla1/nameend/nameendbababa2'這也。這裏很難說明哪個'/ nameend'是關鍵,哪個是價值。使用上面的代碼,你會得到

的String1:blabla1/nameend String2的:bababa2

希望這有助於。

1

最簡單的,乾淨的方法是使用split()

String[] parts = mystring.split("\\s*/name(end|start)\\s*"); 
String string1 = parts[1]; 
String string2 = parts[2]; 

傳遞給split()正則表達式指定的隔膜,它是由包括可選空白之前和限界串之後,前緣和後空白消耗,所以在字符串周圍會自動刪除。