这里我有以下代码。我的想法是使用像"R#GUPW*UIOPW#WERTY*RT#LLOPPPPER*CVW"
这样的短语来返回类似
"#GUPW*"
"#WERTY*"
"#LLOPPPPER*"
返回以#开头并以*结尾的短语中的所有子串。所以在这个短语中有3个。
import java.io.*;
public class Pattern {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
String phrase = "R#GUPW*UIOPW#WERTY*RT#LLOPPPPER*CVW";
String found ="";
for (int y = 0; y<phrase.length(); y++)
{
found = found + phrase.substring(phrase.indexOf("#"), phrase.indexOf("*"));
}
System.out.println(found);
}
}
但是我的代码返回了
"#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW#GUPW"
如何返回这些以#开头并以我的短语结尾的子串。
"#GUPW*"
"#WERTY*"
"#LLOPPPPER*"
答案 0 :(得分:2)
解决方案是定义Pattern
,然后在Matcher
中使用它。
List<String> allMatches = new ArrayList<String>();
Pattern p = Pattern.compile("#[^*]+\\*");
Matcher m = p.matcher(yourString);
while (m.find()) {
allMatches.add(m.group());
}
然后,所有匹配都会显示在List
。
演示:
String s = "R#GUPW*UIOPW#WERTY*RT#LLOPPPPER*CVW";
List<String> allMatches = new ArrayList<String>();
Pattern p = Pattern.compile("#[^*]+\\*");
Matcher m = p.matcher(s);
while (m.find()) {
allMatches.add(m.group());
}
for (String str : allMatches) {
System.out.println(str);
}
>>#GUPW*
>>#WERTY*
>>#LLOPPPPER*
答案 1 :(得分:1)
我只是搜索每个*
,然后从这个位置找到之前的#
(如果有的话)。这看起来像这样:
String input = "R#test*foo#bar#far#bor*for#";
int index = -1, begin;
while((index = input.indexOf("*", index+1)) > -1){
if((begin = input.lastIndexOf("#", index)) > -1){ //If there is a character
// Substract it from the current String
System.out.println(input.substring(begin, index + 1));
}
}
基本上,使用
从*
开始搜索下一个index + 1
(+ 1以防止无限循环)
input.indexOf("*", index+1))
从那里开始,只需使用String.lastIndexOf
从此位置搜索上一个#
。如果Substring中有两个*
,则此解决方案将同时打印两个。
此输出:
#test
#bor
答案 2 :(得分:0)
Apache Commons Libraries中的String utils中已有一种方法可以帮助您完成此任务。方法是StringUtils。substringsBetween。
public static String [] substringsBetween(String str, 字符串打开, String close)在String中搜索由开始和结束标记分隔的子字符串,返回all 匹配数组中的子串。
null输入String返回null。 null open / close返回null(no 比赛)。空(“”)打开/关闭返回null(不匹配)。
StringUtils.substringsBetween("[a][b][c]", "[", "]") = ["a","b","c"]
StringUtils.substringsBetween(null, *, *) = null
StringUtils.substringsBetween(*, null, *) = null
StringUtils.substringsBetween(*, *, null) = null
StringUtils.substringsBetween("", "[", "]") = []
参数:
- str - 包含子串的String,null返回null,empty返回空
- open - 标识子字符串开头的字符串,空返回null close - 标识
的字符串- end - of substring,empty返回null返回:一个字符串的子串数组,如果不匹配则返回null
此方法不包括输出中的分隔符,因此如果您确实需要它,我猜您需要用几行代码修复行为。
答案 3 :(得分:0)
尝试将循环内的代码更改为
int stIndex = phrase.indexOf("#");
int endIndex = phrase.indexOf("*");
found = found + "\n" + phrase.substring(stIndex, endIndex);
phrase = phrase.substring(endIndex + 1);
我做的是找到第一个匹配后我从输入中删除匹配的字符串。
答案 4 :(得分:-2)
String phrase = "R#GUPW*UIOPW#WERTY*RT#LLOPPPPER*CVW";
String[] ph = phrase.substring(phrase.indexOf("#"), phrase.lastIndexOf("*")+1) //get everything between the first "#" and last "*"
.replaceAll("\\*.*?#", "*#") // remove all chars between * and #
.split("(?<=\\*)"); //split at * and keep the delimiter
System.out.println(Arrays.toString(ph));