2014-01-13 98 views
0

我想验证一个字符串只包含某些字和字符。Java检查字符串只有某些字和字符

我要接受一个字符串,需要检查它仅包含以下内容:

  • “(”
  • “)”
  • “和” 注意空格
  • “OR”注意空格
  • 任何整数。如果我可以同时检查它小于10,那将是一种奖励,但如果它使代码复杂化,我可以单独执行此操作。

如果字符串中有任何其他字符或单词,我需要拒绝它。

有效的字符串是: (1 OR((2和3)或4,5))

我觉得正则表达式是要要对这个办法,但我不能工作了如何构建正则表达式来做到这一点。

我知道正则表达式模式是:

  • \(
  • \)
  • \ SOR \ S
  • \砂\ S
  • \ d +

我's已加入他们在一起,所以模式是: “\ sOR \ s | \ sAND \ s | \ d + | \(| \)”

这显然起作用,它会找到任何值,但如果字符串中有额外的字符或字符串,则不会拒绝该字符串。

我不必使用正则表达式,但是当我正在学习它们时,这将是一个理想的例子,可以提供一些帮助。 我一直在使用http://www.regexplanet.com/advanced/java/index.html来测试不同的组合,但现在已经承认失败。

任何帮助表示赞赏。

+2

请注意,正则表达式(通常)只能匹配常规语言。如果你想让正则表达式检查匹配的paranethesis,那么你已经离开了“正规语言国家”:正则表达式不能这样做。换句话说:你不能识别“(1或(”)作为非法表达 –

回答

2

您可以用matches()方法一起使用正则表达式的构建提供你逃避所有的\,并允许与+运营商重复出现次数:

boolean happy = testString.matches("(\\sOR\\s|\\sAND\\s|\\d+|\\(|\\))+"); 

我不知道你less than 10的意思,但如果你的意思是这个数字可以是0-9,你可以用\\b\\d\\b代替\\d+。如果您的意思是允许1-9位数字,则可以使用\\b\\d{1,9}\\b

+0

关于“少于10”,你必须检查数字后面没有其他数字后面的数字来代替'\\ d +通过'\\ d(?!\\ d)'(或'\\ d \\ b'或'\\ b \\ d')。无需检查另一端。 –

+0

@Casimir:是的,我只是我认为添加单词边界('\\ b')将以一种干净的方式照顾问题 – Keppil

+0

@Keppil感谢您的回复,匹配似乎有效,所以我会再测试一下。那么我应该说小于或等于10. 所以1 OR 10是有效的,但1 OR 11不是。我认为这是不可能的与一个正则表达式。 –

0

我会把你可以接受的字符放在一个常量中。然后把你的测试字符串变成一个字符数组,然后逐个字符地查看它,看看它是否在你的常量中。如果没有,就吹起来。成功完成=良好的字符串。

我不认为有一个简短的方法。

相关问题