正则表达式:Java中的匹配和排除;php风味;

正则表达式:Java中的匹配和排除;php风味;,java,php,regex,Java,Php,Regex,我需要一些关于这个正则表达式的帮助: (?<=.)(\^FD).*(\^FS) 我一直在使用它来构建表达式,它在web上似乎匹配正确,但在我的程序中却不匹配->它匹配^FD和^FS排除是什么意思? 正则表达式真的有必要吗 public class Test { public static void main(final String... args) { final String line = "^FO638,340^FDPermit^FS"; final

我需要一些关于这个正则表达式的帮助:

(?<=.)(\^FD).*(\^FS)

我一直在使用它来构建表达式,它在web上似乎匹配正确,但在我的程序中却不匹配->它匹配^FD^FS

排除是什么意思? 正则表达式真的有必要吗

public class Test
{
   public static void main(final String... args) {
      final String line = "^FO638,340^FDPermit^FS";
      final int fdIndex = line.indexOf("^FD") + 3;
      final int fsIndex = line.indexOf("^FS");

      if (fdIndex > -1 && fsIndex > -1) {
         line.substring(fdIndex, fsIndex);
      }
   }
}
如果要排除内部内容,请执行以下操作:

public class Test
{
   public static void main(final String args[]) {
      final String line = "^FO638,340^FDPermit^FSdddd";
      final int fdIndex = line.indexOf("^FD");
      final int fsIndex = line.indexOf("^FS");

      if (fdIndex > -1 && fsIndex > -1) {
         System.out.println(line.substring(0, fdIndex) + line.substring(fsIndex + 3));
      }
   }
}

我看不出有什么问题。这就是在java中使用它的方式,它返回的结果与regex101.com相同

public static void main(String[] args) {
        String text = "^FO638,340^FDPermit^FS\n          ^^^      ^^^\n\n^FO638,390^FD123456^FS\n          ^^^      ^^^\n\n^FO050,500^GB700,1,3^FS\n                    xxx\n\n^FD^FS\n^^^^^^";

        Pattern pattern = Pattern.compile("(?<=.)(\\^FD).*(\\^FS)");
        Matcher matcher = pattern.matcher(text);

        while(matcher.find()){
            System.out.print("Start index: " + matcher.start());
            System.out.print(" End index: " + matcher.end() + " ");
            System.out.println(matcher.group());
        }
    }
这是网站上的答案

Match 1
Full match  10-22   `^FDPermit^FS`
Group 1.    10-13   `^FD`
Group 2.    19-22   `^FS`
Match 2
Full match  57-69   `^FD123456^FS`
Group 1.    57-60   `^FD`
Group 2.    66-69   `^FS`
您可以使用下一个代码打印组

System.out.println(matcher.group(1));
System.out.println(matcher.group(2));

您能否详细说明一下“它在web上似乎匹配正确,但在我的程序中不匹配”它也匹配regex101上介于两者之间的所有内容。正则表达式匹配始终是匹配字符串的子字符串。你不能拿一些中间有洞的。您可以使用第一组(^FD)和第二组(^FS)仅提取它们。但我看不出这一点,因为它们是常量。它不必匹配^FD和^fsi之间的字符串。您可以使用matcher.group(1)和matcher.group(2)它显示了groupsmatcher.group-我将它用作一个特定的字符串,稍后它将匹配CSS中的关键字,我不能在这里使用matcher.group
matcher.group(“FI”)!=无效的“关键字字段”:
感谢您的努力,但在这种情况下我不能使用matcher.group编辑您的问题并显示您的需求。一个真实的例子,所以我们可以帮助你。是的,他们是,因为之后我需要应用另一个正则表达式来匹配所提到的标记之间的特定位。“排除”是指行中不是^FD或^FS的所有内容,它们都必须存在。如果您告诉我以后需要匹配的内容,我可以告诉您是否可以不使用正则表达式。没有它们,代码总是更干净,而且通常更快。
Match 1
Full match  10-22   `^FDPermit^FS`
Group 1.    10-13   `^FD`
Group 2.    19-22   `^FS`
Match 2
Full match  57-69   `^FD123456^FS`
Group 1.    57-60   `^FD`
Group 2.    66-69   `^FS`
System.out.println(matcher.group(1));
System.out.println(matcher.group(2));