0

帮我找到字符串的单个正则表达式:

  1. 567,“这是一个字符,称为A。”
  2. 567,这是一个字符,称为A。
  3. 567,"这是一个字符,称为 (/r) A."

我为此尝试了以下正则表达式:

1.

^([0-9]+)[ ?]*,[ ?]*(?(?=")(("(?:[^"]|"")*"|[^,]*)(,("(?:[^"]|"")*"|[^,]*))*)|([a-z, a-z]*))$

2.

^([0-9]+),(["]{1}[a-z,a-z]*["]{1})$

评论:正则表达式 1 工作正常,但提供 6 个组,因为应该只有 2 个组。

尝试以下链接检查 http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx 选择 MultiLine 进行检查。

4

2 回答 2

1

试试下面的。它假定句点是模式结束的一致指示,并且开始和结束报价是可选的。

^(\d+),["]?([^.]*[.])["]?

这个的c#版本将是......

            var data = @"567,""this is a character, known as A.""
567,This is a character, known as A.
567,""this is a character, known as 
 A.""";
        var pattern = @"^(\d+),[""]?([^.]*[.])[""]?";

        foreach (Match mx in Regex.Matches(data, pattern, RegexOptions.Multiline))
        {
            Console.WriteLine("Group Count: {0}:  Group[1]: {1}, Group[2]: {2}", 
                         mx.Groups.Count, mx.Groups[1].Value, mx.Groups[2].Value);
        }

(注意:你实际上会得到 3 个组,因为第 0 组总是整场比赛,否则你会得到你期望的两个组)

顺便说一句,这种模式是故意通用的。它也适用于输入数据,如......

678, This is a character, known as 1.

这不在原始要求中。但是可以合理地假设您给出的数据示例非常有限,并且可以在数据中搜索其他字符类型。编写一个足够具体的模式以排除误报,同时不遗漏任何合法匹配,这是一种平衡行为。

于 2012-08-29T11:53:59.320 回答
1

regex应该做!

^(\d+),("?[\p{L}\p{P}\s\r]*"?)$

\p{L}-> 匹配所有大小写字母

\p{P}-> 将匹配所有标点符号..

\s-> 匹配空格

\r-> 匹配回车符

于 2012-08-29T11:36:31.807 回答