Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在字符串中查找子字符串之前和之后_Java_Regex_String - Fatal编程技术网

Java 如何在字符串中查找子字符串之前和之后

Java 如何在字符串中查找子字符串之前和之后,java,regex,string,Java,Regex,String,我有一个字符串,比如说123dance456,我需要将它分成两个字符串,分别包含子字符串dance(即123)之前和子字符串dance(即456)之后的第一个子字符串。我需要找到它们并将它们保存在单独的字符串变量中,比如stringfirstsubstring=123和字符串secondSubString=456 是否有任何给定的字符串方法可以做到这一点?您可以这样做: String str = "123dance456"; String substr = "dance"; String bef

我有一个字符串,比如说
123dance456
,我需要将它分成两个字符串,分别包含子字符串
dance
(即
123
)之前和子字符串
dance
(即
456
)之后的第一个子字符串。我需要找到它们并将它们保存在单独的字符串变量中,比如
stringfirstsubstring=123和字符串
secondSubString=456

是否有任何给定的字符串方法可以做到这一点?

您可以这样做:

String str = "123dance456";
String substr = "dance";
String before = str.substring(0, str.indexOf(substr));
String after = str.substring(str.indexOf(substr) + substr.length());

值得注意的是,如果子字符串不止一次出现,则第二个答案不起作用。为此,如果我们只希望识别第一个,则更安全的做法是使用限制调用split:

String[] parts = str.split(substr, 2);
这确保返回的数组最多有两个元素。此外,由于
split
将其输入解释为正则表达式,因此我们必须警惕无效的正则表达式语法。因此,我更倾向于第一个解决方案,因为它的工作与原始子字符串的组成无关

为了使第一个答案更有效——这是我的首选答案——那么,我们需要记住子字符串的位置:

final int position = str.indexOf(substr);
if (position >= 0) {
    //if the substring does occur within the string, set the values accordingly
    before = str.substring(0, position);
    after = str.substring(position + substr.length());
} else {
    //otherwise, default to the empty string (or some other value)
    before = "";
    after = "";
}
始终注意这些小边缘情况。

您可以使用。就这样做吧:

String s = "123dance456";
String[] split = s.split("dance");
String firstSubString = split[0];
String secondSubString = split[1];

请注意,如果原始字符串中多次出现
“dance”
split()
将在每次出现时分割,这就是返回值是数组的原因。

最简单的方法是使用其他答案所建议的
分割方法。您还可以使用a和a来实现更一般的方法:

String[] data = new String("123dance456").split("dance");
String str = "123dance456";
String splitter = "dance";
Pattern p = Pattern.compile("(.*?)" + splitter + "(.*)");
Matcher m = p.matcher(str);
if (m.matches()) {
    firstSubString = m.group(1); // may be empty
    secondSubString = m.group(2); // may be empty
} else {
    // splitter not found in str
}

如果您使用的是commons lang,请参阅StringUtils.substringAfter()

使用扫描仪是一个不错的选择:

Scanner scanner = new Scanner( "123dance456" ).useDelimiter( "dance" );
if ( scanner.hasNext() )
  System.out.println( scanner.next() );
if ( scanner.hasNext() )
  System.out.println( scanner.next() );   
将令牌作为流进行处理非常方便,只需通过
hasNext()
询问是否有新令牌可用。此外,您还可以从
扫描仪
获得很好的转换,甚至可以进行本地化,例如:

Scanner scanner = new Scanner( "123dance456" ).useDelimiter( "dance" );
System.out.println( scanner.nextDouble() * scanner.nextDouble() );   

parts
将是一个
String[]
不会分割返回数组吗?可以这样做,但确切的格式是什么???我的意思是舞蹈会永远存在吗???@dku.rajkumar:是的,“舞蹈”子串永远存在
split()
应该可以做到这一点。我早该想到这样的方法了。我想我可能得为它写一个正则表达式。谢谢:)那么就不需要正则表达式了,只需使用字符串[]str=;弦乐分裂(“舞蹈”);正如前面提到的答案
Scanner scanner = new Scanner( "123dance456" ).useDelimiter( "dance" );
System.out.println( scanner.nextDouble() * scanner.nextDouble() );