У меня есть файл сценария, который я пытаюсь загрузить, и я не могу заставить работать регулярное выражение. Я немного ржавый с моими регулярными выражениями, но я удивлен, что моя работа не работает.
В принципе, каждая строка (кроме пустых строк и тех, которые начинаются с комментария (“//”)), должна иметь следующий формат:
[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
Ваше регулярное выражение должно выглядеть следующим образом:
"[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+
.
Переключение мест между пространством и запятой должно помочь:
@"\d+,\s*0[xX][0-9a-fA-F]+,\s*0[xX][0-9a-fA-F]+,\s*"
Начальная @
помогает с экранами, и вы не должны писать [\s]+
потому что \s
уже является символьным классом, как \d
.
Используйте стенографические строки (введенные с @
). Обратные косые черты не должны быть экранированы в стенографических строках.
Используйте параметр 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
опцию для того, чтобы сделать ^
и $
совпадают начало и конец каждой строки, а не только начало и конец всей строки.
Это может помочь вам, каждый сегмент доступен в группе:
([0-9]+),[\s]+(0[xX][0-9a-fA-F]+,\s+)(0[xX][0-9a-fA-F]+,\s+)(.+)
Демо-версия
Вы можете использовать \d
вместо [0-9]
и изменить этот шаблон, чтобы исключить все, что вы не хотите, хотите в группе.
Здесь вам не нужно регулярное выражение. Простого Сплита достаточно
string input = "01, 0x00100204, 0x00000000, some string goes here";
var parts = input.Split(new char[] { ',' }, 4, StringSplitOptions.RemoveEmptyEntries);