c#Regex用空格替换标点符号,用逗号匹配大括号

时间:2016-09-11 16:18:00

标签: c# regex

我有一个带有标点符号和匹配括号的表单数据。我需要用空格替换标点符号并用逗号匹配大括号。还需要确保最终结果没有多个空格。

例如:

*fName   *   -sName!lName(London) 

应该是

fName sName lName, London

尝试使用三个正则表达式并按顺序替换它们

static string BracePattern = @"[()]";
static string PuncPattern = @"[^\w\,]";
static string SpacePattern = @"\s+";
res1 = Regex.Replace(formData, BracePattern, ",");
res2 = Regex.Replace(res1, PuncPattern , ",");
res3 = Regex.Replace(res2, SpacePattern , ",").trim();

我的最终结果是:

fName sName lName,London,

仍然无法得到。我知道有一个正则表达式可以解决这个问题。但是不能得到它。

3 个答案:

答案 0 :(得分:1)

要替换括号模式,您需要在开始和结束括号之间添加内容的捕获组,并在返回替换值的函数中使用它:

 var replacedBrackets = Regex.Replace(res1,
    @"\((?'content'[^)]+)\)", match => $", {match.Groups["content"].Value}");

您还可以在+添加PuncPattern来替换一系列标点符号'具有单个空格的字符 - 这样可以避免在第三次替换中标准化空间。

有关正常工作的演示,请参阅this fiddle

答案 1 :(得分:0)

试试这个

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string input = "*fName   *   -sName!lName(London) ";
            string pattern = @"(?'word'\w+)";

            MatchCollection matches = Regex.Matches(input, pattern);

            string output = string.Format("{0} {1} {2}, {3}",
                matches[0].Groups["word"].Value,
                matches[1].Groups["word"].Value,
                matches[2].Groups["word"].Value,
                matches[3].Groups["word"].Value
                );
            Console.WriteLine(output);
            Console.ReadLine();

        }
    }
}

答案 2 :(得分:0)

如果您更喜欢非正则表达式的答案,您可以:

  1. 将输入字符串拆分为多个标点符号
  2. Trim()所有令牌
  3. 删除空字符串标记
  4. 检索最后一个字符串标记
  5. 从列表中删除最后一个字符串标记
  6. 使用,
  7. 将最后一个字符串标记附加到结果中

    代码:

    string line = @"*fName   *   -sName!lName(London) ";
    
    var tokens = line.Split(new char[] { '*', '-', '!', '(', ')' })
                        .Select(s => s.Trim())
                        .Where(s => !String.IsNullOrWhiteSpace(s.Trim()))
                        .ToList();
    string last = tokens.Last();
    tokens.RemoveAt(tokens.Count - 1);
    string result = String.Join(" ", tokens) + ", " + last;