[英]C# Regex - How to validate for either specific words or numbers but not both
我需要驗證一個值,要求是它可以包含數字0-9或特定的單詞,但不能同時包含兩者。
我正在使用以下表達式
Regex regex = new Regex(@"\b(Private Bag)\b|[0-9]");
但是,如果發現使用上述表達式進行驗證適用於所有情況。
這個正則表達式在哪里出錯?
您可能需要在模式周圍放置開始( ^
)和結束( $
)錨點。 否則,該模式將匹配包含您的特定單詞或數字的任何值,而不管字符串中出現了什么。 另外,聽起來您需要包含一個或多個( +
)數字:
Regex regex = new Regex(@"^(?:(Private Bag)|[0-9]+)$");
此模式將匹配包含“ Private Bag
或一個或多個十進制數字且不含其他任何內容的字符串。
或者,如果您不關心分組,這會更簡單一些:
Regex regex = new Regex(@"^(Private Bag|[0-9]+)$");
如果您想要的是您的問題陳述
要求是它可以包含數字0-9或一個特定的單詞,但不能同時包含兩者。
(不言而喻地要求其他內容有效),則需要使用負先行 ( (?!xxx)
)和負后備 ( (?<!xxx
)斷言。例如,此正則表達式:
(?<!.*(foo|bar).*)(\d+)(?!.*(foo|bar).*)
應該匹配
(\\d+)
), foo
或bar
開頭,並且 foo
或bar
然后,您需要它的逆:
(?<!.*(\d+).*)(foo|bar)(?!.*(\d+).*)
添加一些分組和交替
((?<!.*(foo|bar).*)(\d+)(?!.*(foo|bar).*))|((?<!.*(\d+).*)(foo|bar)(?!.*(\d+).*))
還有鮑勃的叔叔。 以上應該匹配
foo
或bar
之前或之后,或者... foo
或bar
,其前面或后面都沒有十進制數字序列。 簡單! 或者其他的東西。
您應該注意,特別是如果匹配的文本很長,這幾乎肯定不是很有效,因為它可能涉及大量回溯和前瞻。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.