2

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

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

例子:

可...

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

不可能是...

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

我尝试了很多不同的组合,但我在正则表达式方面还不够好,无法得到这个。

提前致谢

4

6 回答 6

4

嗯,看起来像:

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

(请注意,当我写上面的内容时,您现在编辑的解释都没有出现,所以它只是基于示例。)

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

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

笔记:

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

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

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

测试代码:

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);
            }
        }
    }
}
于 2012-11-01T21:29:42.997 回答
0

这是一个基本版本:(?:[^:.]+:)?(?:[^:.]+\.)?[^:.]+. 如果你定义Anystring得更严格,这可以得到改善。

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

鉴于我拥有的信息,我正在考虑[^:.]+成为一个匹配的正则表达式Anystring,因为唯一的约束是

  • 它不能是零长度
  • 它不能包含冒号或点,(这暗示了最多允许一个冒号和一个句点的事实)
于 2012-11-01T21:30:16.917 回答
0
/^[a-z]+[:.]?[a-z]+[:.]?[a-z]+$/i

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

于 2012-11-01T21:31:15.253 回答
0

似乎符合您列出的所有标准:

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

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

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

  • 一个或多个不是冒号或句点的字符。
    • 可选地后跟一个冒号,然后是一个或多个不是冒号或句点的字符。
    • 可选地后跟一个句点,然后是一个或多个不是冒号或句点的字符。
于 2012-11-01T21:39:07.353 回答
0

试试这个

(.+):(.+)\.(.+)|(.+)\.(.+)
于 2012-11-01T21:54:38.650 回答
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 点的部分分开。在实际使用中,正则表达式中不应有空格。

希望这是有帮助的。

干杯。

于 2012-11-01T22:35:51.833 回答