Регулярное выражение с "|" - PullRequest
2 голосов
/ 29 марта 2010

Мне нужно иметь возможность проверить шаблон с | в них. Например, выражение типа d*|*t должно возвращать true для строки типа "dtest | test".

Я не герой регулярных выражений, поэтому я просто попробовал пару вещей, например:

Regex Pattern = new Regex("s*\|*d"); //unable to build because of single backslash
Regex Pattern = new Regex("s*|*d"); //argument exception error
Regex Pattern = new Regex(@"s*\|*d"); //returns true when I use "dtest" as input, so incorrect
Regex Pattern = new Regex(@"s*|*d"); //argument exception error
Regex Pattern = new Regex("s*\\|*d"); //returns true when I use "dtest" as input, so incorrect
Regex Pattern = new Regex("s*" + "\\|" + "*d"); //returns true when I use "dtest" as input, so incorrect
Regex Pattern = new Regex(@"s*\\|*d"); //argument exception error

У меня нет выбора, что мне тогда использовать? Я имею в виду, что это довольно простое регулярное выражение, которое я знаю, но по какой-то причине его не понимаю.

Ответы [ 6 ]

5 голосов
/ 29 марта 2010

В регулярных выражениях * означает «нули или более (шаблон перед ним)», например a* означает ноль или более a, а (xy)* ожидает совпадения вида xyxyxyxy....

Чтобы соответствовать любым символам, вы должны использовать .*, т.е.

Regex Pattern = new Regex(@"s.*\|.*d");

(также | означает «или»)

Здесь . будет соответствовать любым символам [1] , включая |. Чтобы избежать этого, вам нужно использовать класс символов :

new Regex(@"s[^|]*\|[^d]*d");

Здесь [^x] означает «любой символ, кроме x».

Вы можете прочитать http://www.regular -expressions.info / tutorial.html , чтобы узнать больше о RegEx.

[1]: за исключением новой строки \n. Но . будет соответствовать \n, если вы передадите опцию Singleline. Ну, это более продвинутый материал ...

1 голос
/ 29 марта 2010

A | внутри char class будет трактоваться буквально, поэтому вы можете попробовать регулярное выражение:

[|]
0 голосов
/ 01 октября 2012

В Javascript, если вы создаете
var regex = /somestuff\otherstuff/;,
тогда обратная косая черта соответствует вашим ожиданиям. Но если вы создаете одно и то же с другим синтаксисом
var regex = new Regex("somestuff\\otherstuff");
тогда из-за странности в способе синтаксического анализа Javascript вы должны удвоить все обратные слэши. Я подозреваю, что ваша первая попытка была правильной, но вы импортировали новую проблему, решая старую, в которой вы столкнулись с этой другой проблемой, касающейся одиночных обратных слешей.

0 голосов
/ 29 марта 2010

Regex Pattern = new Regex(@"s*\|*d"); будет работать, за исключением того, что наличие | * означает «0 или более каналов». Таким образом, вы, вероятно, хотите Regex Pattern = new Regex(@"s.*\|.*d");

0 голосов
/ 29 марта 2010

Попробуйте это.

string test1 = "dtest|test";
string test2 = "apple|orange";
string pattern = @"d.*?\|.*?t";

Console.WriteLine(Regex.IsMatch(test1, pattern));
Console.WriteLine(Regex.IsMatch(test2, pattern));
0 голосов
/ 29 марта 2010

Как насчет s.*\|.*d?
Проблема ваших попыток в том, что вы написали что-то вроде s* - что означает: соответствует любое число s (включая 0). Вам нужно определить символы после s, используя ., как в моем примере. Вы можете использовать \w только для буквенно-цифровых символов.

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