簡體   English   中英

C#正則表達式-如何驗證特定的單詞或數字,但不能同時驗證兩者

[英]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).*)

應該匹配

  • 1個或多個十進制數字( (\\d+) ),
  • 在找到的數字之前的任何地方都不能foobar開頭,並且
  • 找到數字后的任何地方都不要跟着foobar

然后,您需要它的逆:

(?<!.*(\d+).*)(foo|bar)(?!.*(\d+).*)

添加一些分組和交替

((?<!.*(foo|bar).*)(\d+)(?!.*(foo|bar).*))|((?<!.*(\d+).*)(foo|bar)(?!.*(\d+).*))

還有鮑勃的叔叔。 以上應該匹配

  • 十進制數字序列,不能在foobar之前或之后,或者...
  • 實例foobar ,其前面或后面都沒有十進制數字序列。

簡單! 或者其他的東西。

您應該注意,特別是如果匹配的文本很長,這幾乎肯定不是很有效,因為它可能涉及大量回溯和前瞻。

暫無
暫無

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

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