例子2

从非字母中间找到英文单词。给定的字符串例如.!?HelloFisher:'it's

需要注意特殊的单词,例如第一1st,第二2nd,数字也是单词的一部分。 或者是带有单引号的单词,例如it's

\w表示[0—9A—Za—z],即数字或者字母。 这里为了匹配到带引号的单词,使用的正则表达式是REG1 = "[^\\w]*([0-9a-zA-Z']+)[^\\w]*"。 找到被其他字符包围的英文单词。这个表达式还是有瑕疵。

运行结果

! 不匹配 [^\w]*([0-9a-zA-Z']+)[^\w]*

!!! 不匹配 [^\w]*([0-9a-zA-Z']+)[^\w]*

输入: ?!Rust ; 正则表达式: [^\w]*([0-9a-zA-Z']+)[^\w]* ; group(0)  == ?!Rust
输入: ?!Rust ; 正则表达式: [^\w]*([0-9a-zA-Z']+)[^\w]* ; group(1)  == Rust

输入: Fisher:' ; 正则表达式: [^\w]*([0-9a-zA-Z']+)[^\w]* ; group(0)  == Fisher:'
输入: Fisher:' ; 正则表达式: [^\w]*([0-9a-zA-Z']+)[^\w]* ; group(1)  == Fisher

输入: ?!THANKS!? ; 正则表达式: [^\w]*([0-9a-zA-Z']+)[^\w]* ; group(0)  == ?!THANKS!?
输入: ?!THANKS!? ; 正则表达式: [^\w]*([0-9a-zA-Z']+)[^\w]* ; group(1)  == THANKS

输入: <<how>> ; 正则表达式: [^\w]*([0-9a-zA-Z']+)[^\w]* ; group(0)  == <<how>>
输入: <<how>> ; 正则表达式: [^\w]*([0-9a-zA-Z']+)[^\w]* ; group(1)  == how

输入: ?1st? ; 正则表达式: [^\w]*([0-9a-zA-Z']+)[^\w]* ; group(0)  == ?1st?
输入: ?1st? ; 正则表达式: [^\w]*([0-9a-zA-Z']+)[^\w]* ; group(1)  == 1st

输入: ?21st! ; 正则表达式: [^\w]*([0-9a-zA-Z']+)[^\w]* ; group(0)  == ?21st!
输入: ?21st! ; 正则表达式: [^\w]*([0-9a-zA-Z']+)[^\w]* ; group(1)  == 21st

输入: ?it's! ; 正则表达式: [^\w]*([0-9a-zA-Z']+)[^\w]* ; group(0)  == ?it's!
输入: ?it's! ; 正则表达式: [^\w]*([0-9a-zA-Z']+)[^\w]* ; group(1)  == it's

示例代码

public class ExtractEnWordBetweenMarks {

    private static final String REG1 = "[^\\w]*([0-9a-zA-Z']+)[^\\w]*";
    private static Pattern pattern = Pattern.compile(REG1);

    public static void main(String[] args) {
        System.out.println("从 [非字母 字母 非字母] 中提取出英文单词");
        final String[] regs = {
                REG1
        };
        final String[] textArr = {"!", "!!!", "?!Rust", "Fisher:'", "?!THANKS!?", "<<how>>", "?1st?", "?21st!", "?it's!"};
        for (String r : regs) {
            for (String s : textArr) {
                extractTextFrom(r, s);
                System.out.println();
            }
        }
    }

    private static void extractTextFrom(String reg, String txt) {
        if (!txt.matches(reg)) {
            System.out.println(txt + " 不匹配 " + reg);
            return;
        }
        Pattern pattern = Pattern.compile(reg);
        Matcher matcher = pattern.matcher(txt);
        while (matcher.find()) {
            for (int i = 0; i <= matcher.groupCount(); i++) {
                System.out.println("输入: "+txt + " ; 正则表达式: " + reg + " ; group(" + i + ")  == " + matcher.group(i));
            }
        }
    }
}

修改正则表达式为[^\w]*([0-9a-zA-Z'"]+)[^\w]*。除了支持单引号,也支持双引号"

需要支持的符号,可以按照上面的样子添加。