Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 匹配“的正则表达式”;{$";和不匹配的\{$";_Java_Regex - Fatal编程技术网

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”);
说明:

据我所见,您希望
\
成为用于转义的特殊字符。
现在的问题是确定
\
在何处转义字符/序列,以及何时应将其视为简单的可打印字符(文字)

(可能的问题)
假设您有text
dir1\dir2\
,并且希望在其后面添加非text
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$}
是:text
dir1\\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中,字符串文本面临着同样的问题,因为
      \