我必须用什么正则表达式来分割它?

时间:2012-03-21 15:07:10

标签: c# regex string split numbers

我是c#的新手。

如果像这样输入我想要节目

输入:There are 4 numbers in this string 40, 30, and 10

输出:

there = string
are = string
4 = number
numbers = string
in = string
this = string
40 = number
, = symbol
30 = number
, = symbol
and = string
10 = number

我试试这个

{
    class Program
    {
        static void Main(string[] args)
        {
            string input = "There are 4 numbers in this string 40, 30, and 10.";
            // Split on one or more non-digit characters.
            string[] numbers = Regex.Split(input, @"(\D+)(\s+)");
            foreach (string value in numbers)
            {
                Console.WriteLine(value);               
            }
        }
    }
}

但输出与我想要的不同..请帮帮我..我被卡住了:((

5 个答案:

答案 0 :(得分:2)

正则表达式解析器具有if条件和将项目分组到命名捕获组的能力;我要展示的。

这是一个示例,其中patttern首先查找符号(只有逗号向集合中添加更多符号[,] )然后编号并将其余部分删除为单词。

string text = @"There are 4 numbers in this string 40, 30, and 10";
string pattern = @"
(?([,])            # If a comma (or other then add it) is found its a symbol
  (?<Symbol>[,])   # Then match the symbol
 |                 # else its not a symbol
  (?(\d+)             # If a number
    (?<Number>\d+)    # Then match the numbers
   |                  # else its not a number
    (?<Word>[^\s]+)   # So it must be a word.
   ) 
)
";


// Ignore pattern white space allows us to comment the pattern only, does not affect
// the processing of the text!
Regex.Matches(text, pattern, RegexOptions.IgnorePatternWhitespace)
     .OfType<Match>()
     .Select (mt => 
    {
        if (mt.Groups["Symbol"].Success)
            return  "Symbol found:     " + mt.Groups["Symbol"].Value;

        if (mt.Groups["Number"].Success) 
            return  "Number found:  " + mt.Groups["Number"].Value;

        return "Word found:     " + mt.Groups["Word"].Value;
    }
     )
     .ToList() // To show the result only remove
     .ForEach(rs => Console.WriteLine (rs));

/* Result
Word found:     There
Word found:     are
Number found:  4
Word found:     numbers
Word found:     in
Word found:     this
Word found:     string
Number found:  40
Symbol found:     ,
Number found:  30
Symbol found:     ,
Word found:     and
Number found:  10
*/

一旦正则表达式对得到的匹配进行了标记化,我们就可以通过识别哪个命名的捕获组成功来获取这些标记。在这个例子中,我们获得了成功的捕获组并将其投影到一个字符串中以便打印出来进行查看。

如果有条件在我的博客Regular Expressions and the If Conditional上讨论正则表达式以获取更多信息。

答案 1 :(得分:1)

您可以使用此模式进行拆分:@"(,)\s?|\s"

这会在逗号上分割,但保留它,因为它在一个组中。 \s?用于匹配可选空格,但会将其从结果中排除。没有它,拆分将包括逗号后发生的空间。接下来,通常会在空格上进行分割。

要对值进行分类,我们可以使用字符串的第一个字符,并使用静态Char方法检查类型。

string input = "There are 4 numbers in this string 40, 30, and 10";
var query = Regex.Split(input, @"(,)\s?|\s")
                 .Select(s => new
                 {
                     Value = s,
                     Type = Char.IsLetter(s[0]) ?
                             "String" : Char.IsDigit(s[0]) ?
                             "Number" : "Symbol"
                 });
foreach (var item in query)
{
    Console.WriteLine("{0} : {1}", item.Value, item.Type);
}

要使用Regex.Matches方法,可以使用此模式:@"\w+|,"

var query = Regex.Matches(input, @"\w+|,").Cast<Match>()
                 .Select(m => new
                 {
                     Value = m.Value,
                     Type = Char.IsLetter(m.Value[0]) ?
                             "String" : Char.IsDigit(m.Value[0]) ?
                             "Number" : "Symbol"
                 });

答案 2 :(得分:0)

如果你想得到数字

var reg = new Regex(@"\d+");
var matches = reg.Matches(input );
var numbers = matches
        .Cast<Match>()
        .Select(m=>Int32.Parse(m.Groups[0].Value));

获得你的输出:

var regSymbols = new Regex(@"(?<number>\d+)|(?<string>\w+)|(?<symbol>(,))");
var sMatches = regSymbols.Matches(input );
var symbols = sMatches
    .Cast<Match>()
    .Select(m=> new
    {                  
       Number = m.Groups["number"].Value,
       String = m.Groups["string"].Value,
       Symbol = m.Groups["symbol"].Value
     })
    .Select(
      m => new 
      {
        Match = !String.IsNullOrEmpty(m.Number) ? 
                    m.Number : !String.IsNullOrEmpty(m.String) 
                            ? m.String : m.Symbol,
        MatchType = !String.IsNullOrEmpty(m.Number) ? 
                    "Number" : !String.IsNullOrEmpty(m.String) 
                            ? "String" : "Symbol"
      }
    );

修改 如果符号多于逗号,你可以将它们分组,如@Bogdan Emil Mariesan所做,正则表达式将是:

@"(?<number>\d+)|(?<string>\w+)|(?<symbol>[,.\?!])"

<强> EDIT2 使用 =

获取字符串
var outputLines = symbols.Select(m=>
                            String.Format("{0} = {1}", m.Match, m.MatchType));

答案 3 :(得分:0)

很好地匹配你可以做的所有数字:

[\d]+

对于字符串:

[a-zA-Z]+

对于某些符号,例如

 [,.?\[\]\\\/;:!\*]+

答案 4 :(得分:0)

你可以很容易地这样做:

string[] tokens = Regex.Split(input, " ");  

foreach(string token in tokens)  
{  
    if(token.Length > 1)  
    {   
       if(Int32.TryParse(token))  
       {  
          Console.WriteLine(token + " =   number");
       }
      else  
      {  
         Console.WriteLine(token + " = string");  
      }  
    }    
    else  
    {
      if(!Char.isLetter(token ) && !Char.isDigit(token))   
      {  
        Console.WriteLine(token + " = symbol");
      }  
  }
}  

我没有IDE方便测试这个编译。基本上你正在做的是在空间上拆分输入然后进行一些比较以确定它是符号,字符串还是数字。