簡體   English   中英

空字符串的模式是什么?

[英]What is the pattern for empty string?

我需要驗證輸入:有效的變量是數字或空字符串。 相應的正則表達式是什么?

String pattern = "\d+|<what shoudl be here?>";

UPD:請不要建議“\\ d *”,我只是好奇如何在regexp中告訴“空字符串”。

在這種特殊情況下, ^\\d*$可以工作,但一般來說,為了匹配pattern或空字符串,您可以使用:

^$|pattern

說明

  • ^$分別是字符串錨點的開頭和結尾。
  • | 用於表示替換,例如, this|that

參考

相關問題


關於多線模式的注意事項

在所謂的多模式( Pattern.MULTILINE/(?m)在Java中),該^$匹配的開頭和結尾來代替。 字符串開頭和結尾的錨點現在分別是\\A\\Z

如果您處於多線模式,則空字符串將與\\A\\Z匹配。 ^$將匹配字符串中的空行。


例子

以下是一些例子來說明以上幾點:

String numbers = "012345";

System.out.println(numbers.replaceAll(".", "<$0>"));
// <0><1><2><3><4><5>

System.out.println(numbers.replaceAll("^.", "<$0>"));
// <0>12345

System.out.println(numbers.replaceAll(".$", "<$0>"));
// 01234<5>

numbers = "012\n345\n678";
System.out.println(numbers.replaceAll("^.", "<$0>"));       
// <0>12
// 345
// 678

System.out.println(numbers.replaceAll("(?m)^.", "<$0>"));       
// <0>12
// <3>45
// <6>78

System.out.println(numbers.replaceAll("(?m).\\Z", "<$0>"));     
// 012
// 345
// 67<8>

關於Java matches注釋

在Java中, matches嘗試將模式與整個字符串進行匹配。

這適用於String.matchesPattern.matchesMatcher.matches

這意味着有時候,對於其他版本和/或其他Java正則表達式方法而言,對於Java matches ,可以省略錨點。

相關問題

/^\d*$/

匹配0或更多數字之前或之后沒有任何內容。

說明:

'^'表示行首。 '$'表示行尾。 '*'匹配0或更多次出現。 因此,模式匹配整個行與0或更多位數。

要顯式匹配空字符串,請使用\\A\\Z

您還可以經常看到^$工作正常,除非將該選項設置為允許^$ anchors不僅匹配字符串的開頭或結尾,而且還匹配每行的開頭/結尾。 如果您的輸入永遠不能包含換行符,那么^$當然是完全正常的。

一些正則表達式風格不支持\\A\\Z錨點(尤其是JavaScript)。

如果你想在“沒有或只有空格”中允許“空”,那么去\\A\\s*\\Z^\\s*$

就像一個有趣的解決方案,你可以這樣做:

\d+|\d{0}

一個數字,零次。 是的,它確實有效。

查看常規語言集合的方法之一是關閉以下內容:

  1. 特殊<EMPTY_STRING>是常規語言
  2. 來自alphaphet的任何符號都是有效的常規語言
  3. 兩個有效正則表達式的任何連接和聯合是常規語言
  4. 任何兩種有效常規語言的聯合都是常規語言
  5. 正則表達式的任何傳遞閉包都是常規語言

Concreate常規語言是此閉包的具體元素。


我沒有在POSIX標准中找到空符號來表達步驟(1)中的常規語言思想。

但是存在像posix定義那樣的問號額外的東西如下:

(regexp | <EMPTY_STRING>)

所以你可以用以下方式為bash,perl和python做:

echo 9023 | grep -E "(1|90)?23"
perl -e "print 'PASS' if (qq(23) =~ /(1|90)?23/)"
python -c "import re; print bool(re.match('^(1|90)?23$', '23'))"

只有"\\d+|"應該沒有任何問題

要使任何匹配整個字符串的模式可選,即允許模式匹配空字符串,請使用可選組

^(pattern)?$
^^       ^^^

請參閱正則表達式演示

如果正則表達式引擎允許(如在Java中),則首選非捕獲組,因為其主要目的是僅對子模式進行分組,而不是保留捕獲的子值:

^(?:pattern)?$

^將匹配字符串的開頭(或者\\A可以在很多種情況下用於此), $將匹配字符串的結尾(或者\\z可用於匹配許多種類的最終結尾,而Java也是如此) ),和(....)? 將匹配括號內的子模式的1或0(由於?量詞) 序列

Java使用說明:在matches() ,可以省略初始^和尾隨$ ,您可以使用

String pattern = "(?:\d+)?";

暫無
暫無

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

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