首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >REGEX返回字符串中所有大写短语的列表

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

Stack Overflow用户
提问于 2012-05-05 01:05:36
回答 3查看 773关注 0票数 2

嗨,我已经在这个问题上混了一段时间了,我想是时候寻求帮助了……

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

因此,对于:

代码语言:javascript
复制
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 SRVD

打印的发现

提交审讯通知

发送了我们的要求

我一直在尝试以下几种不同的方法:

代码语言:javascript
复制
[A-Z][A-Z\d]+ 
[A-Z][A-Z\d]+ [A-Z][A-Z\d]+"

但是,这有点超出了我对Regex的了解范围。

编辑

我在努力

代码语言:javascript
复制
string[] capWords = Regex.Split(d.caption, @"[A-Z\s]{5,}");
foreach (var u in capWords) { Console.WriteLine(u); }

输出:

02/02/12-02:45 PM(长江基建)-01/31/12

: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

Kendall的建议输出:

02/02/12-02:45 PM(长江基建)-01/31/12

: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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-05 01:18:23

尝尝这个。我假设您希望去掉前导/尾随空格。

代码语言:javascript
复制
[A-Z][A-Z ]{4,}[A-Z]

还有,我不认为你想要Regex.Split。

代码语言:javascript
复制
var matches = Regex.Matches(d.caption, @"[A-Z][A-Z ]{4,}[A-Z]");
foreach (var match in matches)
{
    Console.WriteLine(match.Value);
}

您还可以执行以下操作:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2012-05-05 01:11:03

这就是了:

A-Z\s{5,}

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

解释:

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

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

代码:

代码语言:javascript
复制
MatchCollection matches = Regex.Matches(d.caption, @"[A-Z\s]{5,}");
foreach (Match match in matches)
{
    Console.WriteLine(match.Value);
}
票数 3
EN

Stack Overflow用户

发布于 2012-05-05 23:54:25

您已经要求了一个RegEx解决方案,但是使用给定的标准和示例,我无法让一个reg ex计算一个字符串并忽略某个字符类型(空格)。失败发生在像on CAL这样的字符组上,它本应作为匹配失败,但由于总字符数而通过。

因此,为了确保字符组中只有5个大写字符,我必须使用两个regEx表达式。这有点麻烦,我可以使用string方法更快、更简单地完成这项工作。

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

下午5点(- FAIL (前面没有破折号)

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

-DISC RSPNS服务版本0-通行证

-PRINTED发现:- PASS

-ON CAL- FAIL (以破折号终止)

-FILED试用通知(-通过

通过我们的要求( -SENT

除此之外,我已经包含了可以通过以下两种方式之一获得结果的代码。我更喜欢第二种。

代码语言:javascript
复制
        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 = "";
                }
            }
        }
    }

输出如下所示。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10453177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档