我正在努力理解正则表达式中的单词边界\ b。 我读到\ b。
有三个条件我试图使用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但是这并没有让我更清楚。如果你能帮我澄清这一点,我们将不胜感激。
答案 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'