Java 基于模式拆分字符串并将其合并回
我需要根据一个模式拆分一个字符串,然后再次将它合并回字符串的一部分 例如:下面是实际字符串和预期字符串Java 基于模式拆分字符串并将其合并回,java,string,split,Java,String,Split,我需要根据一个模式拆分一个字符串,然后再次将它合并回字符串的一部分 例如:下面是实际字符串和预期字符串 String actualstr="abc.def.ghi.jkl.mno"; String expectedstr="abc.mno"; 当我使用下面的代码时,我可以将其存储在一个数组中,然后迭代以获取它。无论如何,有没有比下面更简单有效的方法呢 String[] splited = actualstr.split("[\\.\\.\\.\\.\\.\\s]+"); 虽然我可以基于索引访
String actualstr="abc.def.ghi.jkl.mno";
String expectedstr="abc.mno";
当我使用下面的代码时,我可以将其存储在一个数组中,然后迭代以获取它。无论如何,有没有比下面更简单有效的方法呢
String[] splited = actualstr.split("[\\.\\.\\.\\.\\.\\s]+");
虽然我可以基于索引访问字符串,但是有没有其他方法可以轻松做到这一点。请告知。在这种情况下,我会使用替换球
String actualstr="abc.def.ghi.jkl.mno";
String str = actualstr.replaceAll("\\..*\\.", ".");
这将用第一个和最后一个
替换所有内容
您也可以使用split
String[] parts = actualString.split("\\.");
string str = parts[0]+"."+parts[parts.length-1]; // first and last word
在这种情况下,我会用一个替代品
String actualstr="abc.def.ghi.jkl.mno";
String str = actualstr.replaceAll("\\..*\\.", ".");
这将用第一个和最后一个
替换所有内容
您也可以使用split
String[] parts = actualString.split("\\.");
string str = parts[0]+"."+parts[parts.length-1]; // first and last word
您不了解正则表达式是如何工作的 这是不带转义符的正则表达式:
[\.\.\.\.\.\.\.\..\s]+
您有一个字符类([]
)。这意味着没有理由在其中包含多个
。您也不需要在char类中转义
s
这里有一个与正则表达式等价的正则表达式:[。\s]+
。作为Java字符串,它是:“[.\\s]+”
您可以对字符串执行
.split(“regex”)
,以获得数组。从这一点上得到解决方案非常简单。您不了解正则表达式是如何工作的
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;
}
这是不带转义符的正则表达式:[\.\.\.\.\.\.\.\..\s]+
您有一个字符类([]
)。这意味着没有理由在其中包含多个
。您也不需要在char类中转义
s
这里有一个与正则表达式等价的正则表达式:[。\s]+
。作为Java字符串,它是:“[.\\s]+”
您可以对字符串执行
.split(“regex”)
,以获得数组。从这一点上得到解决方案非常简单。我会这样做
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;
}
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()方法在内部使用相同的Pattern.compile(),前提是模式长度大于1。这意味着它将在每次调用该方法时执行这种昂贵的模式编译操作。看见因此,对模式进行编译、缓存和重用要好得多
matcher.group(1)指的是()的第一组,即“(\w*\”
matcher.group(2)指的是第二个“(\w*)”
尽管我们在这里不使用它,但请注意组(0)是整个正则表达式的匹配项。我会这样做
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()方法在内部使用相同的Pattern.compile(),前提是模式长度大于1。这意味着它将在每次调用该方法时执行这种昂贵的模式编译操作。看见因此,对模式进行编译、缓存和重用要好得多
matcher.group(1)指的是()的第一组,即“(\w*\”
matcher.group(2)指的是第二个“(\w*)”
尽管我们在这里不使用它,但请注意,组(0)是整个正则表达式的匹配项。拆分字符串并存储在字符串数组中时,原始字符串保持不变。那么为什么要合并呢?您可以使用原始字符串。您只需在
[
和]
中使用\.
一次,即可将正则表达式简化为[\\.\\s]+
。拆分字符串并存储在字符串数组中时,原始字符串保持不变。那为什么合并?您可以使用原始字符串。嗯,您只需要在[
和]
中使用\\.
一次,就可以将正则表达式简化为[\\.\\s]+
。哦,糟糕。谢谢您的评论。:)哦,糟糕。谢谢您的评论。:)非常感谢。为我工作:)谢谢。为我工作:)