将字符串拆分为两部分:大写和其他任何内容

时间:2014-09-08 12:44:09

标签: c# regex

我需要将字符串拆分为两部分。第一部分总是全部大写和数字。第二部分可以是任何东西。

例如:

LOREM IPSUM DOLOR 0,5 SIT Amet consectetur adipiscing elit

应分成

LOREM IPSUM DOLOR 0,5 SIT

Amet consectetur adipiscing elit

此外:

LOREM IPSUM DOLOR 0,5 SIT amet 0.3 consectetur adipiscing elit

应分成

LOREM IPSUM DOLOR 0,5 SIT

amet 0.3 consectetur adipiscing elit

6 个答案:

答案 0 :(得分:4)

你可以试试这个:

Regex regex = new Regex(@"\b(?=[A-Z][a-z])");
string[] result = regex.Split(yourstr, 2);

模式细节:

\b               # \b is a word boundary (limit between a member
                 # of the \w class and an other character
(?=              # open a lookahead assertion that means "followed by"
    [A-Z][a-z]   # an Uppercase and a lowercase letter
)

split方法的第二个参数限制了项目数。

由于您已编辑了问题,并且您现在也希望以第一个小写字母分割,您可以将模式更改为:

Regex regex = new Regex(@"\b(?=[A-Z]?[a-z])");

这使得大写字母可选。

注意:如果要在第一个子字符串末尾修剪潜在的尾随空格,可以将模式更改为:

Regex regex = new Regex(@"\s*\b(?=[A-Z]?[a-z])");

答案 1 :(得分:1)

拆分以下正则表达式

(?<=^[A-Z0-9,\s]+)\s(?![A-Z0-9,]+\b)

示例代码:

string input = "LOREM IPSUM DOLOR 0,5 SIT Amet consectetur adipiscing elit";
string[] parts = Regex.Split(input, @"(?<=^[A-Z0-9,\s]+)\s(?![A-Z0-9,]+\b)");
foreach (string part in parts)
    Console.WriteLine(part);

输出:

LOREM IPSUM DOLOR 0,5 SIT
Amet consectetur adipiscing elit

另一个案例:

string input = "LOREM IPSUM DOLOR 0,5 SIT amet 0.3 consectetur adipiscing elit";
string[] parts = Regex.Split(input, @"(?<=^[A-Z0-9,\s]+)\s(?![A-Z0-9,]+\b)");
foreach (string part in parts)
    Console.WriteLine(part);

输出:

LOREM IPSUM DOLOR 0,5 SIT
amet 0.3 consectetur adipiscing elit

答案 2 :(得分:0)

我对此进行了分割:(?<=[A-Z]) (?=[A-Z]?[a-z])

答案 3 :(得分:0)

既然你已经提到它总是由两部分组成,这个简单的方法可以起作用:

string text = "   LOREM IPSUM DOLOR 0,5 SIT amet 0.3 consectetur adipiscing elit";
string[] words = text.Split(new[]{' '}, StringSplitOptions.RemoveEmptyEntries);
bool startUpper = words.First().All(Char.IsUpper);
var firstSwitchingCaseWord = words
    .Select((word, index) => new { word, index })
    .FirstOrDefault(x => startUpper ? x.word.Any(Char.IsLower) : x.word.Any(Char.IsUpper));
if (firstSwitchingCaseWord != null)
{
    string firstPart = string.Join(" ", words.Take(firstSwitchingCaseWord.index));
    string lastPart  = string.Join(" ", words.Skip(firstSwitchingCaseWord.index));
}

答案 4 :(得分:0)

你说第一个字符应该是大写字母,数字或符号。实际上你必须指定ascii如果你要使用下面的那个,如果你与正则表达式混淆,这是简单易懂的。

目前我已经这样做了,如果第一个字符是上限或数字,如果你想添加一个字符,你需要在 {<>期间 if 条件中指定ascii值{1}} 方法

尝试下面的一个 -

isFound

答案 5 :(得分:0)

如果您的字符串仅在第一次出现时被拆分。

string pattern = "[A-Z]?[a-z]+";            
string toSplit = "LOREM IPSUM DOLOR 0,5 SIT Amet consectetur adipiscing elit Atest sss";
Match match = Regex.Match(toSplit, pattern);
if (match.Success) {
     int index = match.Index;
     string splittedVal = toSplit.Substring(0, index);
     string secondPart = toSplit.Substring(index, toSplit.Length - index);
}