当前位置: 首页 > 面试题库 >

为什么我的正则表达式可以在RegexPlanet和regex101上运行,而不能在我的代码中运行?

路奇
2023-03-14
问题内容

给定#100=SAMPLE('Test','Test',我要提取的字符串100Test。我^#(\d+)=SAMPLE\('([\w-]+)'.*为此创建了正则表达式。

我在RegexPlanet和regex101上测试了regex
。两种工具都能给我带来预期的结果,但是当我尝试在代码中使用它时,却找不到匹配的结果。我使用以下代码片段测试正则表达式:

final String line = "#100=SAMPLE('Test','Test',";
final Pattern pattern = Pattern.compile("^#(\\d+)=SAMPLE\\('([\\w-]+)'.*");
final Matcher matcher = pattern.matcher(line);

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

输出是

true
false
Exception in thread "main" java.lang.IllegalStateException: No match found
    at java.util.regex.Matcher.group(Matcher.java:536)
    at java.util.regex.Matcher.group(Matcher.java:496)
    at Test.main(Test.java:15)

我使用Java 8来编译和运行程序。为什么正则表达式不能与在线工具一起使用,而不能在我的程序中使用?


问题答案:

一个Matcher对象允许您对其进行多次查询,以便您可以查找表达式,获取组,再次查找表达式,获取组,等等。

这意味着在每次调用后,它都会保持状态-匹配成功后产生的组以及继续搜索的位置。

当您连续运行两个匹配/查找方法时,您将得到:

  1. matches() -匹配字符串的开头,设置组。
  2. find() -尝试在先前匹配/找到的出现之后找到模式的下一个出现,设置组。

但是,当然,在您的情况下,文本不包含 两次
出现的模式,仅包含一次。因此,尽管matches()成功并设置了适当的组,find()然后无法找到另一个匹配项,并且这些组无效(匹配/查找失败后无法访问这些组)。

这就是为什么您收到错误消息的原因。

现在,如果你只是玩弄这个,看看之间的区别matchesfind,那么就没有什么错在节目中有他们两个。但是您需要reset()在它们之间使用,这将导致find()不要尝试从matches()停止的位置继续(如果matches()成功,它将始终失败)。相反,它将从头开始扫描,就好像您有一个全新的一样Matcher。它会成功并为您提供团体。

但是正如这里的其他答案所暗示的那样,如果您不只是尝试比较matchesand 的结果find,而是想要匹配您的模式并获得结果,那么您应该只选择
其中 之一。

  • matches()将尝试匹配整个字符串。因此,如果成功,则find()在它之后运行将永远不会成功-因为它从字符串末尾开始搜索。如果你使用matches(),你不需要像锚^,并$在开始和你的模式的结束。
  • find()将尝试匹配字符串中的任何位置。它将从左侧开始扫描,但不需要实际的匹配从此处开始。也可以不止一次使用它。
  • lookingAt()会尝试匹配字符串的开头,但不一定匹配完整的字符串。就像^在模式开始时有一个锚点一样。

因此,您可以选择其中之一适合自己,然后使用它,然后可以使用组。尝试使用组之前,请始终测试匹配是否成功!



 类似资料:
  • 我用ReactJS制作了一个网络应用程序。它在本地主机上运行良好。然而,当我部署到Azure时,每次导航到新页面或重新加载页面时,我都会收到404个错误。 我正在使用Browser路由器,我从网上查看中了解到这有时会导致问题,但我还没有找到解决它的方法。 我在 GitHub 中有该应用程序,因此在 Azure 中我链接到存储库。除了由create-react-app生成的代码外,我还有一个web.

  • 我不知道为什么这个正则表达式不匹配。也许你能发现错误。 ficontents: 我想匹配>>>>>>客户端9462<<<<<捕获该号码,以及此后的所有内容,直到另一个客户端号码。所以我的第一个捕获是“9462”,第二个捕获是“Had a program exception;please check the error log”。 它使用JavaScript设置在regex101.com中工作得很好

  • 我已经在NetBeans中创建了一个Java项目,自动构建的分发文件(.jar)在我的Ubuntu15.04AMD64机器上运行得非常好。 我想在发布它之前确保它在windows上运行,但在windows 7 32位机器上测试后,我发现它不工作。下面是错误消息的屏幕截图。 我可以猜到一些问题--因为它谈到了一个。regex错误。我并没有在代码中真正使用regex,而是使用string.split。

  • 我的问题。我试图运行matplotlib在Python 3.10在我的MacOS,但我得到以下错误: 然而,当我试着跑步的时候 然后我回来 另外,针对 终端说 此外,如果我在Sublime Text 3上使用Python 2.7.16编译代码,我可以使用matplotlib。 我的问题。如何让matplotlib在Python 3.10上运行? 因为我对Python还是新手(或者编程,就此而言),

  • 我使用Eclipse用java编写了一个很酷的程序。当我在eclipse中运行它时,它完全按照预期工作。我将它导出为一个jar文件,这样我就可以使用Launch4j将它转换为一个可执行文件(.exe文件扩展名),我成功地完成了,但是现在当我试图打开可执行文件时,它说程序不兼容。我尝试在命令行编译代码,当我键入“Java计算器”试图运行程序时,它运行得很好。所以我的问题是为什么可执行文件不能工作?任

  • 本文向大家介绍可以少写1000行代码的正则表达式,包括了可以少写1000行代码的正则表达式的使用技巧和注意事项,需要的朋友参考一下 熟练地掌握正则表达式的话,能够使你的开发效率得到极大的提升。 正则表达式经常被用于字段或任意字符串的校验,如下面这段校验基本日期格式的JavaScript代码: 下面是在前端开发中经常使用到的20个正则表达式: 1 . 校验密码强度 密码的强度必须是包含大小写字母和数