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

本文关键字:短语 列表 返回 字符串 REGEX | 更新日期: 2023-09-27 18:33:23

嗨,我一直在玩这个,认为是时候寻求帮助了......

我正在尝试从一个古怪的字符串中返回所有长度超过 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]+"

但是,这有点超出我对正则表达式的了解范围。

编辑

我在努力

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

输出:

02/02

/12-02:45 下午(长江基建(-12-01-31-

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

(JCX( 01/24/12-(自动生成(01/23/12-02:31 PM-文件拉出并提供给 KG 进行响应。(JLS( 01/20/12(PC(-rcd df jmt af

肯德尔的建议输出:

02/02

/12-02:45 下午(长江基建(- 12-01-31-

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

(JCX( 01/24/12-(自动生成(01/23/12-02:31 PM-文件拉出并提供给 KG 进行响应。(JLS( 01/20/12(PC(-rcd df jmt af

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

你来了:

[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);
}

试试这个。我假设您希望剥离前导/尾随空格。

[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);
}

您要求单个正则表达式解决方案,但使用给定的标准和示例,我无法获得单个正则表达式来计算字符串并忽略某种字符类型(空格(。失败发生在像 ON CAL 这样的字符组上,该字符组应该作为匹配失败,但由于总字符数而通过。

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

如果您可以列出有关源文本格式的一些确定性,这可能适用于单个正则表达式。 例如,如果我们知道您要查找的字符组始终以短划线开头,并以非短划线的标点符号结尾,或者以数字结尾。

下午 5 点( --- 失败(前面不带破折号(

(CKI( ---失败(前面没有破折号(

-光盘RSPNS SRVD 0 ---通行证

-印刷发现:---通行证

-在校准- ---失败(以破折号终止(

-提交审判通知(---通过

-发送了我们的要求(---通过

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

        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