Проблема сопоставления с образцом в C # - PullRequest
8 голосов
/ 07 июля 2010

У меня есть строка типа «AAA 101 B202 C 303», и я хочу избавиться от пробела между символом и числом, если они есть. Поэтому после операции строка должна выглядеть как «AAA101 B202 C303». Но я не уверен, может ли регулярное выражение сделать это?

Любая помощь? Заранее спасибо.

Ответы [ 4 ]

8 голосов
/ 07 июля 2010

Да, вы можете сделать это с помощью регулярных выражений. Вот короткий, но полный пример:

using System;
using System.Text.RegularExpressions;

class Test
{
    static void Main()
    {
        string text = "A 101 B202 C 303 ";
        string output = Regex.Replace(text, @"(\p{L}) (\d)", @"$1$2");
        Console.WriteLine(output); // Prints A101 B202 C303
    }
}

(Если вы собираетесь делать это много, вы можете скомпилировать регулярное выражение для шаблона.)

\p{L} соответствует любой букве Юникода - вы можете захотеть быть более строгим.

1 голос
/ 07 июля 2010

Вы можете сделать что-то вроде

([A-Z]+)\s?(\d+)

И заменить на

$1$2

Выражение можно сжать, но вышеприведенное должно работать для входной строки вашего примера.

Что он делает, объявляет группу, содержащую буквы (первый набор паратезов), затем необязательный пробел (\ s?), А затем группу цифр (\ d +). Группы можно использовать при замене, ссылаясь на их индекс, поэтому, если вы хотите избавиться от пробела, просто замените его на $ 1 $ 2.

0 голосов
/ 08 июля 2010

Просто для удовольствия (потому что процесс программирования иногда бывает забавным): o) Я использую LINQ с Aggregate :

 var result = text.Aggregate(
 string.Empty,
 (acc, c) => char.IsLetter(acc.LastOrDefault()) && Char.IsDigit(c) ?
 acc + c.ToString() : acc + (char.IsWhiteSpace(c) && char.IsLetter(acc.LastOrDefault()) ?
 string.Empty : c.ToString())).TrimEnd();
0 голосов
/ 07 июля 2010

Хотя код C # и не такой лаконичный, как в Regex, он довольно простой и очень быстрый:

StringBuilder sb = new StringBuilder();
for(int i=0; i<s.Length; i++)
{
    // exclude spaces preceeded by a letter and succeeded by a number
    if(!(s[i] == ' '
        && i-1 >= 0 && IsLetter(s[i-1])
        && i+1 < s.Length && IsNumber(s[i+1])))
    {
        sb.Append(s[i]);
    }
}
return sb.ToString();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...