正则表达式帮助:我的正则表达式模式将匹配无效字符串

时间:2010-01-01 09:14:00

标签: c# regex match regex-group

我要验证的文本字符串包含我称之为“段”的内容。单个细分可能如下所示:

 [A-Z,S,3]

到目前为止,我设法构建了这个正则表达式模式

(?:\[(?<segment>[^,\]\[}' ]+?,[S|D],\d{1})\])+?

它可以工作,但即使整个文本字符串包含无效文本,它也会返回匹配项。我想我需要在我的模式中的某处使用^$,但我无法弄清楚如何!?

我希望我的模式能够产生以下结果:

  • [A-Z,S,3][A-Za-z0-9åäöÅÄÖ,D,4] 确定(两段)
  • [A-Z,S,3]aaaa[A-Za-z0-9åäöÅÄÖ,D,4] 不匹配
  • crap[A-Z,S,3][A-Za-z0-9åäöÅÄÖ,D,4] 不匹配
  • [A-Z,S,3][] 不匹配
  • [A-Z,S,3][klm,D,4][0-9,S,1] 确定(三段)

2 个答案:

答案 0 :(得分:3)

使用^来锚定开始,使用$来锚定结尾。例如:^(abc)*$,它匹配组的零次或多次重复(本例中为“abc”),并且必须从输入字符串的开头开始并在结束时结束。

^(?:[(?[^,][}' ]+?,[S|D],\d{1})])+$ - 使用不合格+?并不重要,因为您要求它匹配到最后。但是,你的正则表达式有一些问题。

^(?:\[[^,]+,[SD],\d\])+$ - 看起来更像你想要的。

  • 我无法破译第一部分你的意思,所以我的正则表达式比一般要求更通用,[^,]+,将匹配任何序列的非逗号后跟一个逗号,实际上你应该添加]对这个否定的角色类。
  • [S|D]三个字符的字符类,因为|并不代表此处的替换((S|D)与{{1}相同虽然)。
  • [SD]是任何atom的默认值,您无需指定它。

Pseudocode(在codepad.org运行):

{1}

这里的最大区别是表达式仅匹配完整的import re def find_segments(input_string): results = [] regex = re.compile(r"\[([^],]+),([SD]),(\d)\]") start = 0 while True: m = regex.match(input_string, start) if not m: # no match return None # whole string didn't match, do another action as appropriate results.append(m.group(1, 2, 3)) start = m.end(0) if start == len(input_string): break return results print find_segments("[A-Z,S,3][klm,D,4][0-9,S,1]") # output: #[('A-Z', 'S', '3'), ('klm', 'D', '4'), ('0-9', 'S', '1')] 部分,但它会连续应用,因此它们必须在最后一个结束处(或在字符串末尾结束)再次开始。

答案 1 :(得分:0)

你想要这样的东西:

/^(\[[^],]+,[SD],\d\])+$/

以下是如何在C#中使用此正则表达式的示例:

using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main(string[] args)
    {
        string[] tests = {
            "[A-Z,S,3][A-Za-z0-9,D,4]",
            "[A-Z,S,3]aaaa[A-Za-z0-9,D,4]",
            "crap[A-Z,S,3][A-Za-z0-9,D,4]",
            "[A-Z,S,3][]",
            "[A-Z,S,3][klm,D,4][0-9,S,1]"
        };

        string segmentRegex = @"\[([^],]+,[SD],\d)\]";
        string lineRegex = "^(" + segmentRegex + ")+$";

        foreach (string test in tests)
        {
            bool isMatch = Regex.Match(test, lineRegex).Success;
            if (isMatch)
            {
                Console.WriteLine("Successful match: " + test);
                foreach (Match match in Regex.Matches(test, segmentRegex))
                {
                    Console.WriteLine(match.Groups[1]);
                }
            }
        }
    }
}

输出:

Successful match: [A-Z,S,3][A-Za-z0-9,D,4]
A-Z,S,3
A-Za-z0-9,D,4
Successful match: [A-Z,S,3][klm,D,4][0-9,S,1]
A-Z,S,3
klm,D,4
0-9,S,1