我收到一篇长篇文章,其中我需要查找嵌入在&
对中的所有文字(例如,在文字"&hello&&bye&"
中,我需要找到"hello"
{1}}和"bye"
)。
我尝试使用正则表达式".*&([^&])*&.*"
但它不起作用,我不知道这有什么问题。
任何帮助?
由于
答案 0 :(得分:6)
试试这种方式
String data = "&hello&&bye&";
Matcher m = Pattern.compile("&([^&]*)&").matcher(data);
while (m.find())
System.out.println(m.group(1));
输出:
hello
bye
答案 1 :(得分:2)
不需要正则表达式。只是迭代!
boolean started = false;
List<String> list;
int startIndex;
for(int i = 0; i < string.length(); ++i){
if(string.charAt(i) != '&')
continue;
if(!started) {
started = true;
startIndex = i + 1;
}
else {
list.add(string.substring(startIndex, i)); // maybe some +-1 here in indices
}
started = !started;
}
或使用拆分!
String[] parts = string.split("&");
for(int i = 1; i < parts.length; i += 2) { // every second
list.add(parts[i]);
}
答案 2 :(得分:2)
如果您不想使用正则表达式,这是一个简单的方法。
String string = "xyz...." // the string containing "hello", "bye" etc.
String[] tokens = string.split("&"); // this will split the string into an array
// containing tokens separated by "&"
for(int i=0; i<tokens.length; i++)
{
String token = tokens[i];
if(token.length() > 0)
{
// handle edge case
if(i==tokens.length-1)
{
if(string.charAt(string.length()-1) == '&')
System.out.println(token);
}
else
{
System.out.println(token);
}
}
}
答案 3 :(得分:0)
两个问题:
您正在重复捕获组。这意味着您只会捕获组中&
之间的最后一个字母。
您只会匹配最后一个单词,因为.*
会吞噬字符串的其余部分。
改为使用lookarounds:
(?<=&)[^&]+(?=&)
现在,当您第二次应用正则表达式时,整个匹配将为hello
(和bye
)因为周围的&
将不再是匹配的一部分:
List<String> matchList = new ArrayList<String>();
Pattern regex = Pattern.compile("(?<=&)[^&]+(?=&)");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
matchList.add(regexMatcher.group());
}
答案 4 :(得分:0)
周围的.*
没有意义,也没有效果。只需&([^&])*&
即可。
答案 5 :(得分:0)
我会进一步简化它。
&
&
String.split("&&")
关于它们之间的子串在代码中:
if (string.length < 2)
throw new IllegalArgumentException(string); // or return[], whatever
if ( (string.charAt(0) != '&') || (string.charAt(string.length()-1) != '&')
// handle this, too
String inner = string.substring(1, string.length()-1);
return inner.split("&&");