java - 正则表达式理解\b

标签 java regex

我正在努力理解正则表达式中的单词边界\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/

相关文章:

java - 在终端中使用文件作为 Java 程序的参数

java - 如何使用 appium 处理已安装的应用程序?

python - 正则表达式错误 : bad character range 8-1 at position 6

java - 如何检查字符串是否有重复模式?

python - Django URL 正则表达式 : make URL tolerate int or float values

c# - Azure 服务总线序列化问题 [C#/JAVA]

java - 尽管宽度和高度发生变化,Lwjgl/openGL 窗口大小始终保持不变

java - 在 Java JNI 中获取真正的 UTF-8 字符

Java Pattern.matches() 因长字符串而失败

java - 我的 String 和 StringBuilder 未在控制台中显示输出