[英]Extracting both matching and not matching regex
我有一个String
像这样的abc3a de'f gHi?jk
我想将它拆分成子abc3a
, de'f
, gHi
, ?
和jk
。 换句话说,我想返回匹配正则表达式[a-zA-Z0-9']
的字符串和不匹配此正则表达式的字符串。 如果有一种方法可以判断每个结果子字符串是否匹配,则为加号。
谢谢!
您可以使用此正则表达式:
"[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
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
myString.split("\\s+|(?<=[a-zA-Z0-9'])(?=[^a-zA-Z0-9'\\s])|(?<=[^a-zA-Z0-9'\\s])(?=[a-zA-Z0-9'])")
在该字符集中的字符运行之间的所有边界处进行分割。
后退(?<=...)
在运行中的一个字符之后匹配,而前行(?=...)
在该组之外的一系列字符中在字符之前匹配。
\\\\s+
不是边界匹配,而是匹配一系列空格字符。 这具有从结果中完全删除空白的效果。
|
允许在边界处或空白处使分割快乐。
由于lookbehind和lookahead都是正值,因此边界在字符串的开头或结尾将不匹配,因此,除非在其中存在空格,否则无需忽略输出中的空字符串。
您可以使用锚点进行拆分
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
在此位置之前。
由于您不希望在结果中包含所有空格匹配,因此需要过滤split给定的Array。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.