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_Regexbuddy - Fatal编程技术网

为什么';这个Java正则表达式不能工作吗?

为什么';这个Java正则表达式不能工作吗?,java,regex,regexbuddy,Java,Regex,Regexbuddy,我需要创建一个正则表达式,允许字符串包含任意数量的: 字母数字字符 空间 ( ) & 不允许使用其他字符。我曾经构造过以下正则表达式,在RegexBuddy中测试它时,它可以正常工作: \w* *\(*\)*&*\.* 然后,我使用RegexBuddy的“使用”功能将其转换为Java代码,但使用一个简单的测试程序,它似乎无法正常工作: public class RegexTest { public static void main(String[] args) {

我需要创建一个正则表达式,允许字符串包含任意数量的:

  • 字母数字字符
  • 空间
  • (
  • )
  • &
不允许使用其他字符。我曾经构造过以下正则表达式,在RegexBuddy中测试它时,它可以正常工作:

\w* *\(*\)*&*\.*
然后,我使用RegexBuddy的“使用”功能将其转换为Java代码,但使用一个简单的测试程序,它似乎无法正常工作:

public class RegexTest
{
  public static void main(String[] args)
  {
    String test = "(AT) & (T)."; // Should be valid
    System.out.println("Test string matches: "
      + test.matches("\\w* *\\(*\\)*&*\\.*")); // Outputs false
  }
}
  • 我必须承认,我在正则表达式方面有点盲点。有人能解释一下为什么它不起作用吗

    • 也许我误解了你的描述,但你不是在本质上定义了一类没有顺序而不是特定序列的字符吗?您的regexp不应该有[xxxx]+的结构,其中xxxx是您想要的实际字符吗

      正则表达式测试任意数量的空格,后跟任意数量的字母数字字符,后跟任意数量的开括号,后跟任意数量的闭括号,后跟任意数量的符号,后跟任意数量的句点

      你想要的是

      test.matches("[\\w \\(\\)&\\.]*")
      
      正如mmyers所提到的,这允许使用空字符串。如果不希望允许空字符串

      test.matches("[\\w \\(\\)&\\.]+")
      
      尽管这也将允许只使用空格或句点等的字符串。。如果要确保至少有一个字母数字字符

      test.matches("[\\w \\(\\)&\\.]*\\w+[\\w \\(\\)&\\.]*")
      
      所以你明白正则表达式的意思了。。。方括号(“[]”)内的任何内容都表示一组字符。因此,其中“a*”表示0个或多个a,[abc]*表示0个或多个字符,所有字符都是a、b或c。

      正则表达式

      \w* *\(*\)*&*\.*
      
      将为您提供您描述的项目,但仅按您描述的顺序提供,并且每个项目可以是您想要的任意数量。所以“skjhskladkjgsh(((())(())))&&&&&&&&&&&&&&……”是有效的,但不能混合

      您需要这样的正则表达式:

      \[\w\(\)\&\.]+\
      
      这将允许混合所有字符


      编辑:我的正则表达式知识有限,因此上述语法可能并不完美。

      Java代码片段与RegexBuddy中的测试选项卡之间的区别在于Java中的matches()方法需要正则表达式来匹配整个字符串,而RegexBuddy中的测试选项卡允许部分匹配。如果在RegexBuddy中使用原始正则表达式,您将看到多个黄色和蓝色突出显示块。表示RegexBuddy在字符串中找到多个部分匹配项。要获取与matches()一起工作的正则表达式,您需要编辑它,直到整个测试主题以黄色突出显示,或者如果关闭突出显示,直到“查找第一个”按钮选择整个文本


      或者,您可以在正则表达式的开头和结尾使用锚点\A和\Z来强制它匹配整个字符串。当您这样做时,您的正则表达式总是以相同的方式运行,无论您是在RegexBuddy中测试它,还是在Java中使用matches()或其他方法。仅matches()需要完整的字符串匹配。Java中的所有其他Matcher方法都允许部分匹配。

      很好,但您应该提到,这允许使用空字符串,这可能不是他的意图。没关系,只有当字符串不为空时,才能进行正则表达式测试。我扩展了答案,以包括其他几个选项,再解释一下它是如何工作的,避开方括号是不对的。在方括号内,括号、与号或点“[\w()&.]”不需要转义。方括号不转义,正则表达式包含在反斜杠中。除此之外,谢谢你提供的信息。我不知道什么需要转义,什么不需要转义,所以谢谢。为什么有人想在反斜杠中包含正则表达式呢?您的正则表达式中没有任何内容需要转义。您可能正在考虑使用前向斜杠,这是以正则表达式文字为特征的语言中的传统正则表达式分隔符。例如,在JavaScript中,正则表达式应该是/[\w()&.]+/。但在Java中,正则表达式只是字符串,所以您必须将其写成“[\\w()&.]+”。至少每天都是stackoverflow的学习经历:)。就像我说的,我只是想帮忙,但我意识到我的正则表达式知识是有限的。谢谢你澄清这些问题。