什么正则表达式可以验证这种类型的字符串的格式?

时间:2012-11-01 21:25:20

标签: regex

我需要验证字符串是否采用某种格式......这是规则。

  • 可以包含冒号和/或点。
  • 冒号和点都是可选的
  • 如果指定冒号和/或点,则左侧必须至少有一个字符,冒号/点右侧必须有一个字符。
  • 如果指定了两者,冒号必须在点之前
  • 只允许0或1个冒号和0或1个点
  • AnyString表示一个或多个unicode字符的字符串,不包括冒号和点(AnyString不允许使用冒号和点字符。)

示例:

可以......

AnyString:AnyString.AnyString
AnyString:AnyString
AnyString.AnyString
AnyString

不能......

AnyString:.AnyString
AnyString.AnyString:AnyString
AnyString:
AnyString.
:AnyString
.AnyString

我尝试了很多不同的组合,而且我在正则表达式上的表现还不够好。

提前致谢

6 个答案:

答案 0 :(得分:4)

嗯,看起来像:

  • 绝对以一个或多个非冒号或点字符开头
  • 然后可选有一个冒号后跟一个或多个非冒号或点字符
  • 然后可选有一个点后跟一个或多个非冒号或点字符
  • 如果同时存在“冒号加X”和“点加X”部分,则冒号部分必须先出现

(请注意,当我编写上述内容时,您现在编辑的解释都没有出现,因此它仅基于示例。)

所以我希望这是一个像这样的正则表达式:

^[^.:]+(?::[^.:]+)?(?:\.[^.:]+)?$

注意:

  • 您希望将所有这些内容放在逐字字符串文字中,以避免必须转义反斜杠,例如。

    var regex = new Regex(@"^[^.:]+(?::[^.:]+)?(?:\.[^.:]+)?$");
    
  • ^匹配字符串的开头

  • [^.:]将匹配除点或冒号之外的任何字符
  • +是“至少一个”
  • 的语法
  • (?:<subexpression>)non-capturing group
  • 的语法
  • \.是一个转义点,因为.表示“任何字符”
  • ?是“零或一”(即可选)
  • 的语法
  • $匹配字符串的结尾

测试代码:

using System;
using System.Text.RegularExpressions;

class Test
{
    static readonly Regex regex =
        new Regex(@"^[^.:]+(?::[^.:]+)?(?:\.[^.:]+)?$");

    static void Main()
    {
        AssertValid("AnyString:AnyString.AnyString",
                    "AnyString:AnyString",
                    "AnyString.AnyString",
                    "AnyString");

        AssertInvalid("AnyString:.AnyString",
                      "AnyString.AnyString:AnyString",
                      "AnyString:",
                      "AnyString:..Anystring",
                      "AnyString.",
                      ":AnyString",
                      ".AnyString");
    }

    static void AssertValid(params string[] inputs)
    {
        foreach (var input in inputs)
        {
            if (!regex.IsMatch(input))
            {
                Console.WriteLine("Expected to match but didn't: {0}",
                                  input);
            }
        }
    }

    static void AssertInvalid(params string[] inputs)
    {
        foreach (var input in inputs)
        {
            if (regex.IsMatch(input))
            {
                Console.WriteLine("Expected not to match but did: {0}",
                                  input);
            }
        }
    }
}

答案 1 :(得分:0)

这是一个基本版本:(?:[^:.]+:)?(?:[^:.]+\.)?[^:.]+。如果您更严格地定义Anystring,则可以改进。

您的基本要求看起来有3个部分。零或一个&#34; Anystring&#34; s后跟一个冒号,然后是零或一个&#34; Anystring&#34; s后跟一个点,然后是强制性的&#34; Anystring&#34;。这反映在正则表达式的结构中。

根据我的信息,我认为[^:.]+是一个与Anystring匹配的正则表达式,因为唯一的限制是

  • 它不能为零长度
  • 它不能包含冒号或点((最多允许一个冒号和一个句号的事实暗示)

答案 2 :(得分:0)

/^[a-z]+[:.]?[a-z]+[:.]?[a-z]+$/i

怎么样?那个不包括数字。什么是“AnyString”允许包含?

答案 3 :(得分:0)

appears to符合您列出的所有条件:

^[^.:]+(:[^.:]+)?(\.[^.:]+)?$

请注意,我认为AnyString字面上可以是不包含冒号或句号的任何内容。另请注意,我添加了开始/结束行锚点。如果需要,您可以删除它们。

此正则表达式以人类语言翻译为:

  • 一个或多个不是冒号或句号的字符。
    • 可选地后跟一个冒号,然后是一个或多个不是冒号或句号的字符。
    • 可选地后跟一个句点,然后是一个或多个不是冒号或句号的字符。

答案 4 :(得分:0)

试试这个

(.+):(.+)\.(.+)|(.+)\.(.+)

答案 5 :(得分:0)

如果我们正确地将其分解为逻辑部分,那么匹配规则非常简单。

我将采用字符串可以包含的最大可能结构

    TEXT:TEXT.TEXT

我将按如下方式打破这个结构:

    **TEXT**  then  **:CHARACTER**   then   **TEXT**  then **.CHARACTER**     then    **TEXT**

此细分意味着

    1. your text starts with a letter, then 0 or more series of letters follow
    2. after it can either contain or not contain a colon which is immediately followed by a letter
    3. then again 0 or more series of letter; pay attention here **0 or more**
    4. then it can contain or not contain a dot immediately followed by a letter
    5. then again 0 or more series of letters; pay attention here **0 or more**

在经典的正则表达式定义语言中,正则表达式看起来像

    [A..Za..z]+  (:[A..Za..z]){0,1}   [A..Za..z]*   (\.[A..Za..z]){0,1}   [A..Za..z]*

我已经分开了定义上面1到5点的部分,以方便阅读。 在实际使用中,正则表达式中不应有空格。

希望这是有帮助的。

干杯。