正则表达式为一个或多个字母/数字和零或更多空格

时间:2014-04-15 18:19:05

标签: java regex

我想在我的字符串中允许0个或更多空格,在字符串中允许一个或多个A-Z或a-z或0-9。

Regex allowing a space character in Java

建议[0-9A-Za-z ]+

我怀疑,这个正则表达式匹配具有零个或多个空格的模式。

如何在字符串中的任何位置允许0个或更多个空格,并在字符串中的任何位置允许一个或多个字符。

这会有用吗? ([0-9A-Za-z]+)([ ]*)

7 个答案:

答案 0 :(得分:14)

我相信你可以这样做:

([ ]*+[0-9A-Za-z]++[ ]*+)+

这是0个或更多个空格,后跟至少1个alphanum char,后跟0个或更多个空格

^^整件事至少一次。

使用Pshemo的占有量词的思想来加速正则表达式。

答案 1 :(得分:7)

你也可以试试这个:

  ^[0-9A-Za-z ]*[0-9A-Za-z]+[ ]*$

答案 2 :(得分:7)

  

最简单的答案

*表示zero or more相当于{0,}

+表示one or more相当于{1,}

所以看看这个

[A-Z]+表示at least one Capital Letter,可以写成[A-Z]{1,}

[!@#$%&].表示您可以将这些特殊字符zero or more times写成[!@#$%&]{0,}

抱歉,

  

purpose的{​​{1}}为answer

答案 3 :(得分:4)

使用前瞻:

^(?=.*\s*)(?=.*[a-zA-Z0-9]+)[a-zA-Z0-9 ]+$

答案 4 :(得分:1)

在查看其他答案之前,我想出了两个正则表达式:

boolean ok = (myString.matches("^[A-Za-z0-9 ]+$")  &&  !myString.matches("^ *$"));

这匹配一个或多个字母/数字零或多个空格,但仅空格(或没有)。

通过为每个正则表达式预先创建一个匹配器对象,可以提高效率:

   import  java.util.regex.Matcher;
   import  java.util.regex.Pattern;
public class OnePlusLetterDigitZeroPlusSpace  {
   //"": Unused search string, to reuse the matcher object
   private static final Matcher mtchr1PlusLetterDigitSpc = Pattern.compile("^[a-zA-z0-9 ]+$").matcher("");
   private static final Matcher mtchr0PlusSpc = Pattern.compile("^ *$").matcher("");
   public static final void main(String[] ignored)  {
      test("");
      test(" ");
      test("a");
      test("hello ");
      test(" hello ");
      test("hello there");
   }
   private static final void test(String to_search)  {
      System.out.print("\"" + to_search + "\": ");
      if(mtchr1PlusLetterDigitSpc.reset(to_search).matches()  &&  !mtchr0PlusSpc.reset(to_search).matches())  {
         System.out.println("good");
      }  else  {
         System.out.println("BAD");
      }
   }
}

输出:

[C:\java_code\]java OnePlusLetterDigitZeroPlusSpace
"": BAD
" ": BAD
"a": good
"hello ": good
" hello ": good
"hello there": good

当天有趣的正则表达式问题。

答案 5 :(得分:0)

您要求字符串(s)满足此条件(注意:让c∈s表示c∈{x|x is a character in s}。此外,[]表示正则表达式字符类):

(∀c∈s (c∈[0-9A-Za-z ])) ∧ (∃c∈s ∋ c∈[0-9A-Za-z])

考虑否定:

¬((∀c∈s c∈[0-9A-Za-z ]) ∧ (∃c∈s ∋ c∈[0-9A-Za-z]))
⇔
(∃c∈s ∋ c∉[0-9A-Za-z ]) ∨ (∀c∈s c∉[0-9A-Za-z])
⇔
(∃c∈s ∋ c∈[^0-9A-Za-z ]) ∨ (∀c∈s c∈[^0-9A-Za-z])

所以现在我们要构造一个包含非字母数字和非空格字符或仅包含非字母数字字符的正则表达式。

第一个很简单:[^0-9A-Za-z ]
第二个就像它:^[^0-9A-Za-z]*$

将它们组合在一起得到:[^0-9A-Za-z ]|^[^0-9A-Za-z]*$

现在我们需要否定这个正则表达式。显然,我们可以做(?![^0-9A-Za-z ]|^[^0-9A-Za-z]*$)。或者我们可以手动否定正则表达式:

[^0-9A-Za-z ]变为^[0-9A-Za-z ]*$
^[^0-9A-Za-z]*$变为[0-9A-Za-z]。 (注意:我们可以很容易地从一开始就到达这里)

但是现在我们需要将它们与AND结合起来,而不是OR:

由于[0-9A-Za-z][0-9A-Za-z ]的子集,我们可以这样做:

^[0-9A-Za-z ]*[0-9A-Za-z][0-9A-Za-z ]*$

请注意,我们可以将其简化为:

^[0-9A-Za-z ]*[0-9A-Za-z][ ]*$

这只需要匹配[0-9A-Za-z]的字符是可以执行此操作的最后一个字符。我们也可以做

^[ ]*[0-9A-Za-z][0-9A-Za-z ]*$

这将要求匹配[0-9A-Za-z]的字符是第一个可以这样做的字符。

所以现在我们已经完成了。我们可以使用其中一个或(?![^0-9A-Za-z ]|^[^0-9A-Za-z]*$)

注意:String#match的行为就像正则表达式是^ + regex + $一样(其中+是连接)。这可以抛弃一些东西。

答案 6 :(得分:0)

try {
    if (subjectString.matches("(?i)^(?=.*\\s*)(?!.*_)(?=.*[\\w]+)[\\w ]+$")) {
        // String matched entirely
    } else {
        // Match attempt failed
    } 
} catch (PatternSyntaxException ex) {
    // Syntax error in the regular expression
}

或者简单地说:

^(.*\p{Blank}?\p{Alnum}+.*\p{Blank}?)$

Example