为什么';这个Java正则表达式不能工作吗?
我需要创建一个正则表达式,允许字符串包含任意数量的:为什么';这个Java正则表达式不能工作吗?,java,regex,regexbuddy,Java,Regex,Regexbuddy,我需要创建一个正则表达式,允许字符串包含任意数量的: 字母数字字符 空间 ( ) & 不允许使用其他字符。我曾经构造过以下正则表达式,在RegexBuddy中测试它时,它可以正常工作: \w* *\(*\)*&*\.* 然后,我使用RegexBuddy的“使用”功能将其转换为Java代码,但使用一个简单的测试程序,它似乎无法正常工作: public class RegexTest { public static void main(String[] args) {
- 字母数字字符
- 空间
- (
- )
- &
\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的学习经历:)。就像我说的,我只是想帮忙,但我意识到我的正则表达式知识是有限的。谢谢你澄清这些问题。