1

请帮助正则表达式。我正在验证一个字符串。该值不应仅包含 %,如果有 %,则长度应超过 3 个字符,包括 %。% 可以是字符串中的任何位置(包括点)。

我可以想出这个。仅当 % 在字符串中时才应进行此验证。如果没有 %,则不需要验证。

@"^[a-zA-Z0-9'.]*%"; //{3,}$";

谢谢,纳文

例子:

  • "%"- 失败
  • "%12"- 失败
  • "%123"- 经过
  • "%1234"- 经过
  • "12%3"- 经过
  • "abc%"- 经过
  • "abc"- 经过
  • "A"- 经过
  • "ABC"- 经过
4

4 回答 4

6

Contains("%")如果这是您验证的范围,那么您最好Length使用string.

return !value.Contains("%") || value.Length > 3;

使用单个正则表达式来测试总长度和其中的模式本质上是困难的。如果%它们位于固定位置(开始、结束、从开始的第二个字符等),它会更合适,但按原样,这不是一个可以用单个 RegEx优雅地解决的问题。

它可以用一个丑陋的 RegEx 来完成,使用一些外观,但该解决方案不太可能在不同的 RegEx 实现之间移植(例如,它可能不适用于客户端 Javascript 验证)。

于 2013-09-03T16:01:29.280 回答
3

我不认为这需要Regex解决,只是一些字符串方法是可以的:

var valid = !input.Contains("%") || input.Length > 3;

如果你想使用Regex,这里是:

^([^%]+|.{4,})$
于 2013-09-03T16:01:17.670 回答
1

在 c# 中尝试以下表达式:

@"^((?=(?>.*?[^%]){3,}).*|[^%]+)$"

它与您的示例中所述匹配:

  • "%"- 失败
  • "%12"- 失败
  • "%123"- 经过
  • "%1234"- 经过
  • "12%3"- 经过
  • "abc%"- 经过
  • "abc"- 经过
  • "A"- 经过
  • "ABC"- 经过

在同一表达式中使用非捕获、非原子组使其在 javascript 中工作(解决 Jay 的问题):

@"^((?=(?:.*?[^%]){3,}).*|[^%]+)$"
于 2013-09-03T16:17:55.837 回答
1

假设验证需要至少 1 个字符 -

 ^(?:[^%]+|.*[^%].*[^%].*[^%].*)$

与 JonM 相同(虽然不知道如何删除它)。

于 2013-09-03T17:29:52.443 回答