正则表达式为一个或多个字母/数字和零或更多空格
我想在我的字符串中允许0个或更多的空格以及在我的字符串中允许一个或多个AZ或az或0-9。
正则表达式允许Java中的空格字符
建议[0-9A-Za-z ]+
。
我怀疑,这个正则表达式匹配具有零个或多个空格的模式。
如何在字符串中的任何位置允许0个或更多空格以及在字符串中的任何位置允许一个或多个字符。
这会有用吗? ([0-9A-Za-z]+)([ ]*)
我相信你可以这样做:
([ ]*+[0-9A-Za-z]++[ ]*+)+
这是0或更多空格,后跟至少1个alphanum char,然后是0或更多空格
^^整件事至少一次。
使用Pshemo的占有量词的思想来加速正则表达式。
你也可以尝试这个:
^[0-9A-Za-z ]*[0-9A-Za-z]+[ ]*$
最简单的答案
*
表示zero or more
等价于{0,}
+
表示one or more
等价于{1,}
所以看看这个
[AZ]+
表示at least one Capital Letter
,可以写成[AZ]{1,}
[!@#$%&].
意味着你可以将这些特殊字符zero or more times
写成[!@#$%&]{0,}
对不起,可是
这个
answer
的purpose
是as Simple as possible
使用前瞻:
^(?=.*\s*)(?=.*[a-zA-Z0-9]+)[a-zA-Z0-9 ]+$
在查看其他答案之前,我想出了两个正则表达式:
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
当天有趣的正则表达式问题。
你要求字符串满足这个条件(注意:让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∈sc∈[0-9A-Za-z ]) ∧ (∃c∈s ∋ c∈[0-9A-Za-z])) ⇔ (∃c∈s ∋ c∉[0-9A-Za-z ]) ∨ (∀c∈sc∉[0-9A-Za-z]) ⇔ (∃c∈s ∋ c∈[^0-9A-Za-z ]) ∨ (∀c∈sc∈[^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 + $
(其中+
是串联)。 这可以抛出一些东西。
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}?)$
例