2016-11-21 2 views
0

Для данного регулярного выражения, [^a-z]* в lex, вопрос в том, будет ли он соответствовать любому слову, не содержащему строчной буквы, или это неправильная реализация? I.e., для этого конкретного сценария, должно ли данное регулярное выражение использоваться, или это является подходящим для сопоставления слова, которое не имеет строчных букв: [^a-z]+?Regex in lex [^ a-z] *

Мое соображение состоит в том, что это не так, это должно быть + вместо *, так как отрицание диапазона, с 0 или более возможными случаями. кажется неправильным. Но трудно понять, почему это неправильно. Я попробовал несколько инструментов регулярных выражений в Интернете, а также его промах и промахи, некоторые из них показывают, что он работает, а некоторые показывают больше совпадений между символами.

Я бы сказал, что отрицание строчной строки и ее либо 0, либо более тех, которые будут соответствовать строке abc, так как она (удовлетворяет сценарию, что у него ничего нет. можно сказать, что для любой строки. + выглядит как более интуитивно понятный вариант, но в этом случае использовался *, и я считаю его неправильной реализацией, но не могу найти никаких ресурсов для его резервного копирования, поскольку Google не играет хорошо с теми строки поиска.

Некоторые тестовые случаи, это является node.js:

/[^a-z]*$/.test('testTEST123') - True 
/[^a-z]*$/.test('test') - True (this one should be false as per problem statement) 
/[^a-z]+$/.test('testTEST123') - True 
/[^a-z]+$/.test('test') - False (this one is correct, so there are no matches that dont satisfy the regex) 

На regex101.com результаты аналогичны, но выделенная часть - это конец строки, хотя там нет символов.

Я не знаю, существует ли какая-то конкретная реализация регулярных выражений lex, но, как я описал, что-то не так с * использованием для несочетания диапазона.

+0

В чем вопрос? '*' Означает 0 или более, '+' означает 1 или больше. '* 'будет соответствовать любой строке, в том числе пустым – Stefan

+0

Я думаю, что вы чрезмерны. Сделайте regex' [az] 'и посмотрите, содержит ли строка какие-либо совпадения. – 4castle

+0

@Stefan, чтобы перефразировать вопрос, делает ли предоставленное регулярное выражение только соответствие строка, которая не имеет строчных букв или для того, чтобы иметь такое поведение, должен использоваться символ + –

ответ

1

(F) Правила lex никогда не соответствуют пустой строке, поэтому не имеет значения, используете ли вы * или + в этом контексте.

Но я не думаю, что этот вопрос отражает поведение. Правило a (f) lex соответствует самой длинной строке, соответствующей любому шаблону, и [^a-z]+ будет соответствовать любой последовательности символов, будь то пунктуация, пробел, непечатаемые управляющие коды и т. Д., кроме строчные буквы. (Другими словами, это не просто соответствует словам «слова», если у вас нет необычного определения «слова».

+0

Итак, с этой аналогией, неправильно ли говорить, что [^ az] * будет оценивать значение true, т.е. даже если у нас есть чистое строчное слово, например «test», все равно будет совпадение, так как мы можем сказать, что строка имеет 0 чего-то (что является одним из условий, которые удовлетворяют *), так как его почти не имеет значения, что находится внутри [] в этом случае? И добавить, по lex, я имел в виду https://en.wikipedia.org/wiki/Lex_(software). Я не очень хорошо знаком с flex –

+0

@wont: Как я уже сказал, совпадения 0 длины не count в lex. Поэтому, хотя теоретически шаблон соответствует нулевым байтам, он никогда не будет выбранным совпадением.(«Evaluates to true» не имеет смысла в контексте lex. Lex всегда выбирает самое длинное совпадение, даже если два шаблона совпадают с некоторым префиксом ввода.) – rici