我正在开发一个词汇分析项目,基本上我必须生成文本且不是文本的标记。
"{$"
序列之前被视为所有字符。
"{$"
和"$}"
序列中的所有字符。
请注意"{$"
字符序列可以通过编写"\{$"
来转义,因此这也会成为文字的一部分。
我的工作是阅读文本的 String ,为此我正在使用正则表达式。
我正在使用Java Scanner和Pattern类,这是我目前的工作:
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 $}
这是
如何为以下逻辑语句创建正则表达式:
匹配" {$" 不匹配" \ {$"
答案 0 :(得分:3)
答案 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
\"
\uFFFF
\012
。 Java(以及许多其他语言)中使用的解决方案使\
始终是特殊字符,创建\
字面值需要使用另一个\
转义它(没有真正需要添加另一个特殊的角色)。因此,要表示\
,我们需要将其写为\\
。
因此,如果我们有文字dir1\dir2\
,我们需要将其写为dir1\\dir2\\
。这将允许我们连接到它{$non-text$}
,而不用担心\\
之前放置的{$
会导致对它的误解,并防止将其视为非文本序列。
现在,当我们看到dir1\\dir2\\{$foo$}
时,我们可以正确地解释{$
。
从这一点开始,我假设您也在使用这种方法,以确保正确解释\
。
现在,让我们尝试创建一个规则,让我们找到/分离文本和非文本字符。
根据我们的示例,我们知道dir1\\dir2\\{$foo$}
是:文字dir1\\dir2\\
和非文字{$foo$}
。
因此,当您看到{$
之前没有\
之前的分裂时,有时可能会失败(如果前面的\
的数量不是奇数)。
可能更简单的解决方案是接受
\\.
- 代表\
前面的字符的正则表达式(这将处理\\
文字和转义\{
(这也将允许我们接受其余的{{} 1}}部分)$..$}
- 表示不会(?!\{\$).
开始{
区域的字符的正则表达式。{$
- 代表\{\$.*?\$\}
的正则表达式 - 我们知道它将被取消转义,因为{$...$}
将接受所有转义字符。