正则表达式匹配" {$"不匹配" \ {$"

时间:2016-03-28 14:20:51

标签: java regex

我正在开发一个词汇分析项目,基本上我必须生成文本不是文本的标记。

  • text 的标记在"{$"序列之前被视为所有字符。
  • 非文字的标记被视为"{$""$}"序列中的所有字符。

请注意"{$"字符序列可以通过编写"\{$"转义,因此这也会成为文字的一部分。
我的工作是阅读文本 String ,为此我正在使用正则表达式

我正在使用Java ScannerPattern类,这是我目前的工作:

String text = "This is \\{$ just text$}\nThis is {$not_text$}."
Scanner sc = new Scanner(text);
Pattern textPattern = Pattern.compile("{\\$"); // insert working regex here
sc.useDelimiter(textPattern);

System.out.println(sc.next());

这应该打印出来:

  

这是\ {$ just text $}
    这是

如何为以下逻辑语句创建正则表达式

  

匹配" {$" 不匹配" \ {$"

2 个答案:

答案 0 :(得分:3)

您可以在(?<!\\)前使用Negative Look-Behind \{\$,以确保转义的花括号不匹配:

(?<!\\)\{\$

Demo

答案 1 :(得分:1)

可能的解决方案:

String text = "This is \\{$ just text$}\nThis is {$not_text$}.";
Pattern textPattern = Pattern.compile(
          "(?<text>(?:\\\\.|(?!\\{\\$).)+)" // text - `\x` or non-start-of `{$`
        + "|"                        // OR
        + "(?<nonText>\\{\\$.*?\\$\\})");      // non-text
Matcher m = textPattern.matcher(text);
while (m.find()) {
    if (m.group(1)!=null){
        System.out.println("text : "+m.group("text"));
    }else{
        System.out.println("non-text : "+m.group("nonText"));
    }
}
System.out.println("\01234");

说明:

从我看到的情况来看,您希望\成为用于转义的特殊字符
现在的问题是确定\在其后的字符/序列转义的意义,以及何时应将其视为简单的可打印字符(文字)。

(可能的问题)
假设您有文字dir1\dir2\,并且您希望在非文字foo之后添加。你会怎么写的?

您可以尝试撰写dir1\dir2\{$foo$},但这可能意味着您刚刚转发{$,这会阻止foo被视为非文字。

在Java中,字符串文字面临同样的问题,因为\可以用来创建其他特殊字符

  • \n \r \t \"
  • Unicode代码点\uFFFF
  • 八进制格式\012

Java(以及许多其他语言)中使用的解决方案使\始终是特殊字符,创建\字面值需要使用另一个\转义它(没有真正需要添加另一个特殊的角色)。因此,要表示\,我们需要将其写为\\

因此,如果我们有文字dir1\dir2\,我们需要将其写为dir1\\dir2\\。这将允许我们连接到它{$non-text$},而不用担心\\之前放置的{$会导致对它的误解,并防止将其视为非文本序列。

现在,当我们看到dir1\\dir2\\{$foo$}时,我们可以正确地解释{$

从这一点开始,我假设您也在使用这种方法,以确保正确解释\

现在,让我们尝试创建一个规则,让我们找到/分离文本和非文本字符。

根据我们的示例,我们知道dir1\\dir2\\{$foo$}是:文字dir1\\dir2\\和非文字{$foo$}
因此,当您看到{$之前没有\之前的分裂时,有时可能会失败(如果前面的\的数量不是奇数)。

可能更简单的解决方案是接受

  • for text:
    • \\. - 代表\前面的字符的正则表达式(这将处理\\文字和转义\{(这也将允许我们接受其余的{{} 1}}部分)
    • $..$} - 表示不会(?!\{\$).开始{区域的字符的正则表达式。
  • 非文字:
    • {$ - 代表\{\$.*?\$\}的正则表达式 - 我们知道它将被取消转义,因为{$...$}将接受所有转义字符。