【问题标题】:Regex: match and exclude in Java; php flavor;正则表达式:Java 中的匹配和排除; php风味;
【发布时间】:2017-07-29 08:12:20
【问题描述】:

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

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

我正在尝试匹配 ^FD^FS 但仅当它们都可用时;因此排除介于两者之间的所有内容

^FO638,340^FDPermit^FS
          ^^^      ^^^

^FO638,390^FD123456^FS
          ^^^      ^^^

^FO050,500^GB700,1,3^FS
                    xxx

^FD^FS
^^^^^^

我一直在使用 https://regex101.com/ 构建表达式,它似乎在网络上正确匹配,但在我的程序中却没有 -> 它匹配 ^FD 之间的所有内容^FS

【问题讨论】:

  • 您能否详细说明“它似乎在网络上正确匹配,但在我的程序中不匹配”
  • 它也匹配 regex101 之间的所有内容。正则表达式匹配始终是匹配字符串的子字符串。你不能拿一些中间有洞的东西。您可以使用第一组 (^FD) 和第二组 (^FS) 仅提取它们。但我不明白这一点,因为它们是不变的。

标签: java php regex


【解决方案1】:

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

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));
      }
   }
}

【讨论】:

  • 是的,因为之后我需要应用另一个正则表达式来匹配上述标签之间的特定位。排除意味着所有不是 ^FD 或 ^FS 的内容,并且它们都必须存在
  • 如果你告诉你之后需要匹配什么,我可以告诉你是否可以不使用正则表达式。没有它们,代码总是更干净,而且通常更快。
【解决方案2】:

我没有看到问题。这就是你在 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());
        }
    }

输出是:

Start index: 10 End index: 22 ^FDPermit^FS
Start index: 57 End index: 69 ^FD123456^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));

【讨论】:

  • 不必匹配^FD和^FS之间的字符串
  • 你可以使用 matcher.group(1) 和 matcher.group(2) 它显示组
  • matcher.group - 我后来用它来匹配一个特定的字符串,后来匹配 CSS 中的一个关键字,我不能在这里使用 matcher.group matcher.group("FI") != null ? "keyword_field" :
  • 感谢您的努力,但在这种情况下我不能使用 matcher.group
  • 编辑您的问题并展示您想要的内容。一个真实的例子,所以我们可以帮助你。
猜你喜欢
  • 1970-01-01
  • 2010-11-06
  • 2022-12-11
  • 2019-09-26
  • 1970-01-01
  • 1970-01-01
  • 2022-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多