我有String
喜欢这个abc3a de'f gHi?jk
我希望将其拆分为子字符串abc3a
,de'f
,gHi
,?
和jk
。换句话说,我想返回与正则表达式[a-zA-Z0-9']
匹配的字符串和与此正则表达式不匹配的字符串。如果有办法判断每个产生的子字符串是否匹配,这将是一个加号。
谢谢!
答案 0 :(得分:3)
您可以使用此正则表达式:
"[a-zA-Z0-9']+|[^a-zA-Z0-9' ]+"
会给:
["abc3a", "de'f", "gHi", "?", "jk"]
Pattern p = Pattern.compile("[a-zA-Z0-9']+|[^a-zA-Z0-9' ]+");
Matcher m = p.matcher("abc3a de'f gHi?jk");
while (m.find())
System.out.println(m.group());
abc3a
de'f
gHi
?
jk
答案 1 :(得分:3)
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class HelloWorld{
public static void main(String []args){
Pattern pattern = Pattern.compile("([a-zA-Z0-9']*)?([^a-zA-Z0-9']*)?");
String str = "abc3a de'f gHi?jk";
Matcher matcher = pattern.matcher(str);
while(matcher.find()){
if(matcher.group(1).length() > 0)
System.out.println("Match:" + matcher.group(1));
if(matcher.group(2).length() > 0)
System.out.println("Miss: `" + matcher.group(2) + "`");
}
}
}
输出:
Match:abc3a
Miss: ` `
Match:de'f
Miss: ` `
Match:gHi
Miss: `?`
Match:jk
如果你不想要空格。
Pattern pattern = Pattern.compile("([a-zA-Z0-9']*)?([^a-zA-Z0-9'\\s]*)?");
输出:
Match:abc3a
Match:de'f
Match:gHi
Miss: `?`
Match:jk
答案 2 :(得分:2)
myString.split("\\s+|(?<=[a-zA-Z0-9'])(?=[^a-zA-Z0-9'\\s])|(?<=[^a-zA-Z0-9'\\s])(?=[a-zA-Z0-9'])")
在该charset中的字符行之间的所有边界处进行分割。
后视(?<=...)
在运行中的字符后匹配,而前瞻(?=...)
在集合外的字符集中的字符之前匹配。
\\s+
不是边界匹配,并且匹配一系列空白字符。这样可以完全消除结果中的空白区域。
|
允许在任意边界或一系列空白处导致分裂为快乐。
由于lookbehind和lookahead都是正数,因此边界在字符串的开头或结尾不会匹配,所以除非那里有空格,否则不需要忽略输出中的空字符串。
答案 3 :(得分:1)
您可以使用锚点来拆分
private static String[] splitString(final String s) {
final String [] arr = s.split("(?=[^a-zA-Z0-9'])|(?<=[^a-zA-Z0-9'])");
final ArrayList<String> strings = new ArrayList<String>(arr.length);
for (final String str : arr) {
if(!"".equals(str.trim())) {
strings.add(str);
}
}
return strings.toArray(new String[strings.size()]);
}
(?=xxx)
表示xxx
将在此处跟随,(?<=xxx)
表示xxx
在此位置之前。
由于您不希望在结果中包含所有空白匹配,因此您需要过滤分割给出的数组。