REGEX返回字符串中所有大写短语的列表

时间:2012-05-04 17:05:36

标签: c# regex

嗨,我一直在讨论这个问题,因为现在是时候寻求帮助......

我正在尝试从一个古怪的字符串中返回超过5个字符的所有大写字符(非数字或特殊字符短语)序列。

所以:

02/02/12-02:45 PM(CKI)-DISC RSPNS SRVD 01/31/12-PRINTED DISCOVERY:spina.bp.doc(DGB)   
01/27/12-ON CAL-FILED NOTICE OF TRIAL(JCX) 01/24/12-SENT OUR DEMANDS(Auto-Gen) 01/23/12-
02:31  PM-File pulled and given to KG for responses.(JLS) 01/20/12(PC)-rcd df jmt af

我想要返回

列表

DISC RSPNS SRVD

印刷发现

已提交审判通知

出售我们的需求

我一直在愚弄以下各种变体:

[A-Z][A-Z\d]+ 
[A-Z][A-Z\d]+ [A-Z][A-Z\d]+"

然而,这与我的Regex知识范围有点不同。

修改

我正在尝试

string[] capWords = Regex.Split(d.caption, @"[A-Z\s]{5,}");
foreach (var u in capWords) { Console.WriteLine(u); }

输出:

02/02 / 12-02:45 PM(CKI) - 12年1月31日 -

:spina.bp.doc(DGB)01/27/12 -

(JCX)01/24 / 12- (Auto-Gen)01/23 / 12-02:31 PM-File被提取并送给KG回复。(JLS)01/20/12(PC)-rcd df jmt af

肯德尔的建议输出:

02/02 / 12-02:45 PM(CKI) -  12年1月31日 -

:spina.bp.doc(DGB)01/27/12 -

(JCX)01/24 / 12- (Auto-Gen)01/23 / 12-02:31 PM-File被提取并送给KG回复。(JLS)01/20/12(PC)-rcd df jmt af

3 个答案:

答案 0 :(得分:3)

你走了:

[A-Z \ s]的{5,}

经过测试并仅返回您列出的项目。

说明:

[A-Z\s] - 仅匹配大写字母和空格

{5,} - 匹配项必须至少为5个字符,字符数没有上限

代码:

MatchCollection matches = Regex.Matches(d.caption, @"[A-Z\s]{5,}");
foreach (Match match in matches)
{
    Console.WriteLine(match.Value);
}

答案 1 :(得分:2)

试试这个。我假设你想要删除前导/尾随空格。

[A-Z][A-Z ]{4,}[A-Z]

另外,我认为你不想要Regex.Split。

var matches = Regex.Matches(d.caption, @"[A-Z][A-Z ]{4,}[A-Z]");
foreach (var match in matches)
{
    Console.WriteLine(match.Value);
}

你也可以这样做:

var matches = Regex.Matches(d.caption, @"[A-Z][A-Z ]{4,}[A-Z]")
                   .OfType<Match>()
                   .Select(m => m.Value);
foreach (string match in matches)
{
    Console.WriteLine(match);
}

答案 2 :(得分:0)

您曾要求使用单一的RegEx解决方案,但是使用给定的条件和示例我无法获得单个reg ex来计算字符串并忽略某个字符类型(空格)。失败发生在像ON CAL这样的字符组中,它们应该作为匹配而失败,但由于总字符数而被传递。

因此,为了确保只有5个大写字符的字符组,我必须使用两个regEx表达式。这有点麻烦,我能够用字符串方法更快更简单地做到这一点。

如果您可以列出有关源文本格式的一些确定性,这可能适用于单个regEx。例如,如果我们知道您要查找的字符组始终以破折号开头,并以不是破折号的标点符号终止,或以数字结尾。

下午5点(---失败(之前没有破折号)

(CKI)---失败(之前没有破折号)

-DISC RSPNS SRVD 0 --- PASS

-PRINTED DISCOVERY:--- PASS

-ON CAL- ---失败(以破折号终止)

-FILED审判通知(---通过

- 我们的要求(---通行证

除此之外,我已经包含了以两种方式之一为您提供结果的代码。我更喜欢第二种。

        String source1 = "02/02/12-02:45 PM(CKI)-DISC RSPNS SRVD 01/31/12-PRINTED
 DISCOVERY:spina.bp.doc(DGB) 01/27/12-ON CAL-FILED NOTICE OF TRIAL(JCX) 01/24/12-SENT
 OUR DEMANDS(Auto-Gen) 01/23/12- 02:31 PM-File pulled and given to KG for responses.(JLS) 01/20/12(PC)-rcd df jmt af ";

    String assembledString;

    public void bumbleBeeTunaTest()
    {
        String strippedString = source1.Replace(" ", "");

        String regString1 = ""; 
        String regString2 = @"([A-Z]{6,})";
        String matchHold1,matchHold1First,matchHold1Last,matchHold1Middle;
        Int32 matchHold1Len;


        Regex regExTwo = new Regex(regString2);

        MatchCollection regMatch2 = regExTwo.Matches(strippedString);


        foreach (Match match2 in regMatch2)
        {
            matchHold1 = match2.Groups[1].Value;
            matchHold1Len = matchHold1.Length;
            matchHold1First = matchHold1.Substring(0,1);
            matchHold1Last = matchHold1.Substring(matchHold1Len - 1,1);
            matchHold1Middle = matchHold1.Substring(1, matchHold1Len - 2);


            Debug.Print("Stripped String Matches - " + matchHold1);


            regString1 = @"(" + matchHold1First + "[" + matchHold1Middle+  " ]{" + (matchHold1Len -1) + ",}" + matchHold1Last + ")";

            Regex regExOne = new Regex(regString1);

            MatchCollection regMatch1 = regExOne.Matches(source1);

            regMatch1 = regExOne.Matches(source1);



            foreach (Match match1 in regMatch1)
            {

                Debug.Print("Re-Assembled Matches :" + match1.Groups[1].Value.ToString());
            }

        }

        // Does the same thing as the above.  Just a little simpler.
        for (int i = 0; i < source1.Length; i++)
        {
            if (char.IsUpper(source1[i]) | char.IsWhiteSpace(source1[i]))
            {
                assembledString += source1[i];
            }
            else
            {
                if (!string.IsNullOrEmpty(assembledString))
                {
                    if (assembledString.Count(char.IsUpper) > 5)
                    {
                        Debug.Print("Non Reg Ex Version "  + assembledString);
                    }
                    assembledString = "";
                }
            }
        }
    }

输出看起来像这样。

Stripped String Matches - DISCRSPNSSRVD
Re-Assembled Matches :DISC RSPNS SRVD
Stripped String Matches - PRINTEDDISCOVERY
Re-Assembled Matches :PRINTED DISCOVERY
Stripped String Matches - FILEDNOTICEOFTRIAL
Re-Assembled Matches :FILED NOTICE OF TRIAL
Stripped String Matches - SENTOURDEMANDS
Re-Assembled Matches :SENT OUR DEMANDS
Non Reg Ex Version DISC RSPNS SRVD 
Non Reg Ex Version PRINTED DISCOVERY
Non Reg Ex Version FILED NOTICE OF TRIAL
Non Reg Ex Version SENT OUR DEMANDS