2

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

  • 字母数字字符
  • 空间
  • (
  • )
  • &
  • .

不允许使用其他字符。我使用RegexBuddy构建了以下正则表达式,当我在 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
  }
}
  • 我必须承认,在正则表达式方面我有点盲点。谁能解释为什么它不起作用?
4

4 回答 4

13

该正则表达式测试任意数量的空格,然后是任意数量的字母数字字符,然后是任意数量的左括号,然后是任意数量的右括号,然后是任意数量的&符号,然后是任意数量的句点。

你想要的是...

test.matches("[\\w \\(\\)&\\.]*")

正如 mmyers 所提到的,这允许空字符串。如果您不想允许空字符串...

test.matches("[\\w \\(\\)&\\.]+")

虽然这也将允许一个只有空格或只有句点等的字符串。如果你想确保至少有一个字母数字字符......

test.matches("[\\w \\(\\)&\\.]*\\w+[\\w \\(\\)&\\.]*")

所以你明白正则表达式在说什么......方括号(“[]”)内的任何内容都表示一组字符。因此,“a*”表示 0 个或多个 a,[abc]* 表示 0 个或多个字符,所有字符都是 a、b 或 c。

于 2009-04-22T16:03:13.100 回答
4

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

于 2009-04-22T16:03:00.307 回答
4

Java 代码片段与 RegexBuddy 中的 Test 选项卡之间的区别在于 Java 中的 matches() 方法需要正则表达式来匹配整个字符串,而 RegexBuddy 中的 Test 选项卡允许部分匹配。如果您在 RegexBuddy 中使用原始正则表达式,您将看到多个黄色和蓝色突出显示的块。这表明 RegexBuddy 在您的字符串中发现了多个部分匹配项。要获得与 match() 一起使用的正则表达式,您需要对其进行编辑,直到整个测试主题以黄色突出显示,或者如果您关闭突出显示,直到 Find First 按钮选择整个文本。

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

于 2009-04-23T12:30:15.630 回答
2

正则表达式

\w* *\(*\)*&*\.*

会给你你描述的项目,但只能按照你描述的顺序,每一个都可以随心所欲。所以“skjhsklasdkjgsh((((())))))&&&&&.....”有效,但不能混合字符。

你想要这样的正则表达式:

\[\w\(\)\&\.]+\

这将允许混合所有字符。

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

于 2009-04-22T16:06:14.620 回答