正则表达式理解\ b

时间:2016-05-21 04:28:58

标签: java regex

我正在努力理解正则表达式中的单词边界\ b。 我读到\ b。

有三个条件
  • 在字符串中的第一个字符之前,如果第一个字符是a 字符。
  • 在字符串中的最后一个字符之后,如果最后一个字符是a 字符。
  • 字符串中的两个字符之间,其中一个是单词字符 而另一个不是一个字符。

我试图使用java方法start()

找到上一个匹配的起始索引
import java.util.regex.*;
class Quetico{
    public static void main(String[] args){
        Pattern p = Pattern.compile(args[0]);
        Matcher m = p.matcher(args[[1]]);
        System.out.print("match positions: ");
        while(m.find()){
            System.out.print(m.start()+" ");
        }
        System.out.println();
    }
}

%java Quetico" \ b" " ^ 23 * $ 76 bc"

//string: ^23 *$76 bc     pattern:\b
//index : 01234567890

产生:1 3 5 6 7 9

我无法理解为什么会产生这个结果。因为我很难看到这种模式。香港专业教育学院试过看反向,\ B产生0 2 4 8但是这并没有让我更清楚。如果你能帮我澄清这一点,我们将不胜感激。

1 个答案:

答案 0 :(得分:3)

这里的问题不是Java,而是Linux / Unix。当您在命令行上的双引号之间放置文本时,大多数特殊shell字符(例如*?等)不再特殊 - 除了变量插值。 (以及其他一些东西,比如!,取决于你正在使用哪种贝壳味道。)因此,如果你说

% command "this $variable is interesting"

如果您将variable设置为value,则会使用一个参数this value is interesting调用您的命令。在您的情况下,Linux会将$7视为shell脚本参数,即使您不在shell脚本中;因为它没有设置为任何东西,所以它被替换为空字符串,结果与运行时相同

% java Quetico "\b" "^23 *6 bc"

如果我在Java程序中使用该字符串文字(而不是在命令行上),则会给我1 3 5 6 7 9

为了防止shell解释$,您需要使用单引号:

% java Quetico "\b" '^23 *$76 bc'