2013-05-18 171 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()正则表达式指定的隔膜,它是由包括可选空白之前和限界串之后,前缘和后空白消耗,所以在字符串周围会自动删除。