Java 匹配“的正则表达式”;{$";和不匹配的\{$";
我正在进行一个词法分析项目,基本上我必须生成文本和非文本的标记Java 匹配“的正则表达式”;{$";和不匹配的\{$";,java,regex,Java,Regex,我正在进行一个词法分析项目,基本上我必须生成文本和非文本的标记 在“{$”序列之前,文本标记被视为所有字符。 非文本标记被视为“{$”和“$}”序列中的所有字符。 请注意,“{$”字符序列可以通过写入“\{$”进行转义,因此这也成为文本的一部分 我的工作是读取一串文本,为此我使用正则表达式。 我正在使用Java和类,这是我迄今为止的工作: String text = "This is \\{$ just text$}\nThis is {$not_text$}." Scanner sc =
- 在
序列之前,文本标记被视为所有字符。“{$”
- 非文本标记被视为
和“{$”
“$}”序列中的所有字符。
“{$”
字符序列可以通过写入“\{$”
进行转义,因此这也成为文本的一部分我的工作是读取一串文本,为此我使用正则表达式。 我正在使用Java和类,这是我迄今为止的工作:
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$}这是 如何为以下逻辑语句生成正则表达式: 匹配“{$”和不匹配“\{$” 您可以使用
(?在\{\$
前面)确保转义的花括号不匹配:
(?<!\\)\{\$
(?
您可以使用(?)在\{\$
前面,以确保转义的花括号不匹配:
(?<!\\)\{\$
(?
可能的解决方案:
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");
String text=“这是\\{$just text$}\n这是{$not\u text$}。”;
Pattern textPattern=Pattern.compile(
“(?(?:\\\.\;(?!\\{\\$)+)”//text-`\x`或非`{$`
+“|”//或
+“(?\{\\$.*?\\$\})”;//非文本
Matcher m=textPattern.Matcher(文本);
while(m.find()){
如果(m.group(1)!=null){
System.out.println(“文本:+m.group(“文本”);
}否则{
System.out.println(“非文本:+m.group(“非文本”));
}
}
系统输出打印项次(“\01234”);
说明:
据我所见,您希望\
成为用于转义的特殊字符。
现在的问题是确定\
在何处转义字符/序列,以及何时应将其视为简单的可打印字符(文字)
(可能的问题)
假设您有textdir1\dir2\
,并且希望在其后面添加非textfoo
。您将如何编写它
您可以尝试编写dir1\dir2\{$foo$}
,但这可能意味着您刚刚转义了{$
,这将防止foo
被视为非文本
在Java中,字符串文本面临同样的问题,因为\
可以使用
- 成对
\n
\r
\t
\“
- Unicode码点
\uFFFF
- 八进制格式
\012
Java(和许多其他语言)中使用的解决方案是使\
始终是特殊字符,要创建\
文本,需要使用另一个\
对其进行转义(实际上不需要为此添加另一个特殊字符)。因此,要表示\
,我们需要将其写成\
因此,如果我们有文本dir1\dir2\
,我们需要将它写成dir1\\dir2\\\
。这将允许我们连接到它{$non-text$}
,而不用担心将最后一个\\
放在{$
前面会导致对它的误解,并防止将其视为非文本序列
所以现在当我们看到dir1\\dir2\\{$foo$}
时,我们可以正确地解释{$
从这一点出发,我假设您也在使用这种方法,以确保正确解释\
现在,让我们尝试创建一个规则,该规则允许我们查找/分离文本和非文本字符
根据我们的示例,我们知道dir1\\dir2\\{$foo$}
是:textdir1\\dir2\\\
和non-text{$foo$}
所以,正如您所看到的,{$
前面没有\
的拆分有时会失败(如果前面的\
的数量不是奇数)
也许更简单的解决办法是接受
- 正文:
\.
-表示前面有\
的字符的正则表达式(这将处理\\
文本和转义\{
(这也将允许我们接受$..$}
部分的其余部分)
(?!\{\$)。
-表示字符的正则表达式,该字符不是{
,它将启动{$
区域
- 对于非文本:
\{\$.\$\}
-表示{$…$}
的正则表达式-我们知道它将被取消转义,因为所有转义字符都将被\\.
接受
可能的解决方案:
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");
String text=“这是\\{$just text$}\n这是{$not\u text$}。”;
Pattern textPattern=Pattern.compile(
“(?(?:\\\.\;(?!\\{\\$)+)”//text-`\x`或非`{$`
+“|”//或
+“(?\{\\$.*?\\$\})”;//非文本
Matcher m=textPattern.Matcher(文本);
while(m.find()){
如果(m.group(1)!=null){
System.out.println(“文本:+m.group(“文本”);
}否则{
System.out.println(“非文本:+m.group(“非文本”));
}
}
系统输出打印项次(“\01234”);
说明:
据我所见,您希望\
成为用于转义的特殊字符。
现在的问题是确定在字符/序列之后的转义位置以及什么时候应该将其视为简单的可打印字符(文字)
(可能的问题)
假设您有文本dir1\dir2\
并且您希望在它之后添加非文本foo
。您将如何编写它
您可以尝试编写dir1\dir2\{$foo$}
,但这可能意味着您刚刚转义了{$
,这将防止foo
被视为非文本
在Java中,字符串文本面临着同样的问题,因为\