Согласование регулярных выражений с любой строкой в конце

Вопрос:

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

В принципе, каждая строка (кроме пустых строк и тех, которые начинаются с комментария (“//”)), должна иметь следующий формат:

[decimal number],[hex number],[hex number],[any string of characters]

Так, например, каждая строка без пробелов или комментариев должна выглядеть так:

01, 0x00100204, 0x00000000, some string goes here

Моя модель соответствия выглядит следующим образом

"[0-9]+[\\s]+,0[xX][0-9a-fA-F]+[\\s]+,0[xX][0-9a-fA-F]+[\\s]+,"

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

—-edit —–
Я также хочу отметить, что мне все равно, сколько пробелов между окончанием числа и следующей запятой, следовательно, [\\s]+.

Лучший ответ:

Поместите запятую перед \s+ в вашем шаблоне регулярного выражения.

выберите в соответствии с вашими потребностями. \s соответствуют любому символу пробела [\r\n\t\f ]. Если вы ищете только пространство, используйте вместо \s

\s*   zero or more times
\s+   one or more times
\s?   zero or one times

Ответ №1

Ваше регулярное выражение должно выглядеть следующим образом:

"[0-9]+,\\s*0[xX][0-9a-fA-F]+,\\s*0[xX][0-9a-fA-F]+,\\s*"

Лучшим подходом для соответствия всей строке будет:

@"(?mi)^[0-9]+,\s*0x[0-9a-f]+,\s*0x[0-9a-f]+,.*$"

Если вы знаете, что у вас всегда будет 1 или более пробельных символов, используйте вместо этого \s+.

Ответ №2

Переключение мест между пространством и запятой должно помочь:

@"\d+,\s*0[xX][0-9a-fA-F]+,\s*0[xX][0-9a-fA-F]+,\s*"

Начальная @ помогает с экранами, и вы не должны писать [\s]+ потому что \s уже является символьным классом, как \d.

Ответ №3

Используйте стенографические строки (введенные с @). Обратные косые черты не должны быть экранированы в стенографических строках.

Используйте параметр RegexOptions.IgnoreCase, вместо того чтобы предоставлять варианты lower- и в верхнем регистре.

string pattern = @"^\d+,\s*0x[0-9a-f]+,\s*0x[0-9a-f]+,.*$";
MatchCollection matches = Regex.Matches(input, pattern,
RegexOptions.IgnoreCase | RegexOptions.Multiline);

^ и $ соответствуют началу и концу строк. Если входная строка содержит все строки, используйте RegexOptions.Multiline опцию для того, чтобы сделать ^ и $ совпадают начало и конец каждой строки, а не только начало и конец всей строки.

Ответ №4

Это может помочь вам, каждый сегмент доступен в группе:

([0-9]+),[\s]+(0[xX][0-9a-fA-F]+,\s+)(0[xX][0-9a-fA-F]+,\s+)(.+)

Демо-версия

Вы можете использовать \d вместо [0-9] и изменить этот шаблон, чтобы исключить все, что вы не хотите, хотите в группе.

Ответ №5

Здесь вам не нужно регулярное выражение. Простого Сплита достаточно

string input = "01, 0x00100204, 0x00000000, some string goes here";

var parts = input.Split(new char[] { ',' }, 4, StringSplitOptions.RemoveEmptyEntries);

Оцените статью
TechArks.Ru
Добавить комментарий