簡體   English   中英

正則表達式匹配的是什么

[英]Regular Expression What is Matched

假設你有一個像這樣的正則表達式:

\d+\.?\d* (mg |teaspoon |mcg |tablet |units |puffs |tab )*(\d )*(P\.O\. )*((once )*daily|B\.I\.D\.*|(once )*a day|Q\.I\.D\.|nightly|P\.R\.N\.|T\.I\.D\.|every (other )*(day|morning))

其中包含各種表達方式,包括:

每天1茶匙
1.5毫克
每晚10毫克1 PO

等等

我想要了解的是,每天說1.5毫克和1.5毫克匹配,一個java正則表達式總是匹配最長的字符串?

使用您當前擁有的表達式它實際上不匹配“1.5 mg”,因為定義頻率的最后一個組不是可選的。

要用更一般的術語回答你的問題,如果你有一個與正則表達式匹配的字符串,並且該字符串的子字符串也匹配, 那么它完全取決於將匹配的正則表達式

例如,使用字符串“foobar”,您將使用正則表達式foo(bar)*匹配整個字符串,但只匹配“foo”與正則表達式foo(bar)*?

如果要確保最大的字符串始終匹配,請確保在交替時首先放置較長的元素,例如(foobar|foo)而不是(foo|foobar) 你也可能想避免使用像*?這樣的懶惰重復*? +? ,還是??

當然,這些只是一些一般性指導原則,徹底測試和重構你的正則表達式,直到你在所有情況下得到預期的結果。

java正則表達式總是匹配最長的字符串嗎?

不會。正則表達式並不總是與最長的字符串匹配,因為正則表達式庫通常會在找到匹配項后停止,而不會回溯以查找更長的匹配項。

例如,

Pattern p = Pattern.compile("a|aa");
Matcher m = p.matcher("aaa");
while (m.find()) { System.out.println(m.group()); }

將打印

a
a
a

aa
a

這也會影響組匹配。

導致混淆的一個地方是當人們試圖使用正則表達式按字母順序匹配標識符列表時,做類似的事情

Pattern.compile("<(/?)(a|b|p|pre|s|script)[^>]*>")

匹配標簽。 給定輸入"<script>Not text in an s tag</script>" ,組2將包含"s" ,而不是"script"

在這種情況下,如果模式的其余部分與較長的String匹配,則將返回最長的String,而不是最短的String。

public static void main(String[] args) {
    String regex = "\\d+.?\\d* (mg |teaspoon |mcg |tablet |units |puffs |tab )(\\d )(P.O. )*((once )daily|B.I.D.|(once )a day|Q.I.D.|nightly|P.R.N.|T.I.D.|every (other )(day|morning))";

    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher("1.5 mg 10 mg 1 P.O. nightly");
    while(m.find()){
        System.out.println(m.group());
    }

}

打印: 每晚10毫克1 PO

暫無
暫無

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

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