繁体   English   中英

提取匹配和不匹配的正则表达式

[英]Extracting both matching and not matching regex

我有一个String像这样的abc3a de'f gHi?jk我想将它拆分成子abc3ade'fgHi? jk 换句话说,我想返回匹配正则表达式[a-zA-Z0-9']的字符串不匹配此正则表达式的字符串。 如果有一种方法可以判断每个结果子字符串是否匹配,则为加号。

谢谢!

您可以使用此正则表达式:

"[a-zA-Z0-9']+|[^a-zA-Z0-9' ]+"

会给:

["abc3a", "de'f", "gHi", "?", "jk"]

在线演示: http : //regex101.com/r/xS0qG4

Java代码:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM