我需要根据模式拆分字符串,然后我需要将其合并回字符串的一部分。
for ex:下面是实际和预期的字符串。
String actualstr="abc.def.ghi.jkl.mno";
String expectedstr="abc.mno";
当我在下面使用时,我可以存储在一个数组中并迭代以取回它。无论如何,它可以比下面简单有效。
String[] splited = actualstr.split("[\\.\\.\\.\\.\\.\\s]+");
虽然我可以根据索引访问字符串,但还有其他方法可以轻松完成此操作。请指教。
答案 0 :(得分:2)
你不明白正则表达式如何运作。
这是没有转义的正则表达式:[\.\.\.\.\.\s]+
你有一个角色类([]
)。这意味着没有理由在其中包含多个.
。您也不需要在char类中转义.
。
以下是正则表达式的等效正则表达式:[.\s]+
。作为Java字符串:"[.\\s]+"
。
您可以对字符串执行.split("regex")
以获取数组。从那时起获得解决方案非常简单。
答案 1 :(得分:1)
在这种情况下我会使用replaceAll
String actualstr="abc.def.ghi.jkl.mno";
String str = actualstr.replaceAll("\\..*\\.", ".");
这将使用.
.
的所有内容
您也可以使用拆分
String[] parts = actualString.split("\\.");
string str = parts[0]+"."+parts[parts.length-1]; // first and last word
答案 2 :(得分:1)
public static String merge(String string, String delimiter, int... partnumbers)
{
String[] parts = string.split(delimiter);
String result = "";
for ( int x = 0 ; x < partnumbers.length ; x ++ )
{
result += result.length() > 0 ? delimiter.replaceAll("\\\\","") : "";
result += parts[partnumbers[x]];
}
return result;
}
然后像:
一样使用它merge("abc.def.ghi.jkl.mno", "\\.", 0, 4);
答案 3 :(得分:1)
我会这样做
Pattern pattern = Pattern.compile("(\\w*\\.).*\\.(\\w*)");
Matcher matcher = pattern.matcher("abc.def.ghi.jkl.mno");
if (matcher.matches()) {
System.out.println(matcher.group(1) + matcher.group(2));
}
如果可以缓存
的结果Pattern.compile("(\\w*\\.).*\\.(\\w*)")
并重新使用“模式”这个代码将非常有效,因为模式编译是最昂贵的。其他答案建议使用的java.lang.String.split()方法如果模式长度大于1,则在内部使用相同的Pattern.compile()。这意味着它将在每次调用方法时执行这种昂贵的模式编译操作。见java.util.regex - importance of Pattern.compile()?。因此,编译和缓存并重用模式会好得多。
matcher.group(1)引用第一组(),即“(\ w * \。)” matcher.group(2)指的是第二个“(\ w *)”
即使我们不在这里使用它,但只是要注意group(0)是整个正则表达式的匹配。