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

时间:2014-01-08 20:45:57

标签: java regex

我有String喜欢这个abc3a de'f gHi?jk我希望将其拆分为子字符串abc3ade'fgHi?jk。换句话说,我想返回与正则表达式[a-zA-Z0-9'] 匹配的字符串和与此正则表达式不匹配的字符串。如果有办法判断每个产生的子字符串是否匹配,这将是一个加号。

谢谢!

4 个答案:

答案 0 :(得分:3)

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

"[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

答案 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在此位置之前。

由于您不希望在结果中包含所有空白匹配,因此您需要过滤分割给出的数组。