Отделение некоторых знаков от других знаков в строке - PullRequest
0 голосов
/ 05 сентября 2011

Попытка перезаписи Я хочу разделить "(" ")" "&&" "||" из моей строки

мой оригинальный вопрос: Отделение чисел от других знаков в строке Я использую этот пример

string text = "(54&&1)||15";
Regex pattern = new Regex(@"\(|\)|&&|\|\||\d+");
Match match = pattern.Match(text);
while (match.Success)
{
Console.WriteLine(match.Value);
match = match.NextMatch();
}

моя проблема в том, что я не всегда получаю правильную строку только с цифрами и знаками Я мог бы получить странную строку как:

0ò8F&|&&booBl||aBla

Я хочу, чтобы он был отделен от

0ò8F&| && booBl || aBla

Ответы [ 4 ]

2 голосов
/ 05 сентября 2011

Причина, по которой он не работает, состоит в том, что, предполагая, что вы используете регулярное выражение, предоставленное Джоном Скитом в принятом вами ответе, вы не ищете эту формулировку в своей строке.Задано регулярное выражение:

\(|\)|&&|\|\||\d+

это выглядит так:

NODE                     EXPLANATION
  \(                       '('
 |                        OR
  \)                       ')'
 |                        OR
  &&                       '&&'
 |                        OR
  \|\|                     '||'
 |                        OR
  \d+                      digits (0-9) (1 or more times (matching
                           the most amount possible))

(любезно предоставлено http://rick.measham.id.au/paste/explain.pl) с небольшими изменениями.

Как вы можете видетьнет никакого способа, которым это будет соответствовать "&" или "1 & 2", поэтому, если вы хотите, чтобы вы это сделали, вам нужно включить эти значения в регулярное выражение.

Это регулярное выражение опирается на исходное выражение:

Я получил строку, содержащую:

"(" ")" "&&" "||"

и цифры (от 0 до 99999).

Один & в вашей строке, которая не работает, не соответствует вышеприведенному. Действительно ли так, что у вас может быть четыре вышеуказанных строковых токена, а затем любой другой текст или все еще существуют ограничения, например числаи необязательный сингл &? Если это так, то это на самом деле проблема, отличная от оригинальной ...

Если вы хотите использовать эти четыре вещи в качестве разделителей для произвольного текста, тогда Regex.Split может стать выходом(http://msdn.microsoft.com/en-us/library/8yttk7sy.aspx).

string[] results = Regex.Split(@"(54&1&1)||15", @"(\()|(\))|(&&)|(\|\|)");

Выше следует разделить первую строку на четыре указанных delimiters ("(" ")" "&&" "||") и выводят все разделенные строки и сами разделители.Одна из проблем, с которой вы можете столкнуться, заключается в том, что, если два разделителя находятся рядом, вы получите пустое значение в массиве, которое вам необходимо будет принять во внимание.

Результаты выше:

0 - 
1 - (
2 - 54&1&1
3 - )
4 -  
5 - ||
6 - 15

Также это не будет работать на .NET 1.0 или 1.1, но я надеюсь, что это не будет проблемой.

Следует отметить, что регулярное выражение было немного изменено, чтобы охватить все захватыв скобках, чтобы они захватывали группы и удаляли группу \ d +, которая просто использовалась для всего, что не было разделителями.

Чтобы удалить пустые записи из массива, все, что вам нужно, это строка кода, подобная:

results = results.Where(x=>!String.IsNullOrEmpty(x)).ToArray();

Конечно, вы можете оставить его как IEnumberable или аналогичный, если вам на самом деле не нужно это как массив.

0 голосов
/ 05 сентября 2011

Это будет делать то, что вы просите:

@"\(|\)|&&|\|\||.+?(?=\(|\)|&&|\|\||$)"

Он заменяет набор символов \d+ в предыдущем шаблоне на .+?(?=\(|\)|&&|\|\||$), который использует положительный прогноз, чтобы дать команду движку захватывать все, кроме, кроме ваших токенов оператора.

0 голосов
/ 05 сентября 2011

Вы пытались ответить на мой первоначальный вопрос?

См .: Отделение чисел от других знаков в строке

Это решает вашу проблему.

var operators = new [] { "(", ")", "&&", "||", };

Func<string, IEnumerable<string>> operatorSplit = t =>
{
    Func<string, string, IEnumerable<string>> inner = null;
    inner = (p, x) =>
    {
        if (x.Length == 0)
        {
            return new [] { p, };
        }
        else
        {
            var op = operators.FirstOrDefault(o => x.StartsWith(o));
            if (op != null)
            {
                return (new [] { p, op }).Concat(inner("", x.Substring(op.Length)));
            }
            else
            {
                return inner(p + x.Substring(0, 1), x.Substring(1));
            }
        }
    };
    return inner("", t).Where(x => !String.IsNullOrEmpty(x));
};

var list = operatorSplit("0ò8F&|&&booBl||aBla").ToList();

Результат: { "0ò8F&|", "&&", "booBl", "||", "aBla" }

0 голосов
/ 05 сентября 2011
   List<string> sList = new List<string>();
    Regex pattern = new Regex(@"\(|\)|&&|\|\||\d+");
    Match match = pattern.Match(text);
    while (match.Success)
    {
        sList.Add(match.Value);
        //Console.WriteLine(text2[nCounter]);
        match = match.NextMatch();

    }string text = "(54&&1)||15";     

sList содержит желаемый результат

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...