簡體   English   中英

正則表達式為一個或多個字母/數字和零或更多空格

[英]Regex for ONE-or-more letters/digits And ZERO-or-more spaces

我想在我的字符串中允許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的占有量詞的思想來加速正則表達式。

最簡單的答案

*表示zero or more等價於{0,}

+表示one or more等價於{1,}

所以看看這個

[AZ]+表示at least one Capital Letter ,可以寫成[AZ]{1,}

[!@#$%&]. 意味着你可以將這些特殊字符zero or more times寫成[!@#$%&]{0,}

對不起,可是

這個answerpurposeas Simple as possible

你也可以嘗試這個:

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

使用前瞻:

^(?=.*\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

當天有趣的正則表達式問題。

你問這個字符串( 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 + $ (其中+是串聯)。 這可以拋出一些東西。

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}?)$

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM