我正在努力理解正则表达式中的单词边界\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 但这并没有让我更清楚。如果您能帮我澄清这一点,我将不胜感激。
最佳答案
这里的问题不是 Java,而是 Linux/Unix。当您在命令行上将文本放在双引号之间时,大多数特殊的 shell 字符(例如 *
、?
等)不再是特殊的 --除了变量插值。 (还有其他一些东西,比如 !
取决于您使用的 shell 风格。)因此,如果您说
% command "this $variable 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'
关于java - 正则表达式理解\b,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37358882/