2015-07-11 2 views
2
>> 'hola(' =~ /\w+[^(]/ 
=> 0 
>> $& 
=> "hola" 

Насколько я знаю, /\w+[^(]/ должен соответствовать слово не сопровождаемый ( Я также попытался с negative look-behind и уйти от (;?. С тем же результаты.Почему это регулярное выражение соответствует/ W + [^ (]/

что я нахожу Estrange об этом, в том, что если я попытаюсь с /a[^(]/, он работает (как и ожидалось).

>> 'hola(' =~ /a[^(]/ 
=> nil 

так что, безусловно, имеет что-то делать с + квантора ,

Что происходит?

Я попытался с помощью Ruby 2.2 и Python 3.3

+2

'\ w +' соответствует "hol", а '[^ (]' соответствует «a». –

+0

[String # = ~] (http://ruby-doc.org/core-2.2.0/String. html # method-i-3D-7E) просто говорит вам, есть ли совпадение (и есть ли он, где он начинается). Здесь вам лучше найти *, что * соответствует, если есть совпадение. , используйте [String # [\]] (http://ruby-doc.org/core-2.2.0/String.html#method-i-5B-5D) (или [String # match] (http: // ruby-doc.org/core-2.2.0/String.html#method-i-match)) с регулярным выражением: 'hola ('[/ \ w + [^ (] /] # =>" hola "'. Это приводит вас к объяснению @Chris.Вы получите нужный результат, добавив начало и конец строковых привязок к вашему регулярному выражению: ''hola (' [/^\ w + [^ (] $ /] # => nil'. –

ответ

1

На самом деле \w+[^(] соответствует одному или более слов-знаков, затем любой символ, который не является (. Значит, это будет соответствовать hola и игнорировать последнего символа.

В зависимости от того, где вы хотите использовать этот шаблон, может быть более подходящим шаблон, например \w+\b(?!\(), так как он будет соответствовать любому слову, за которым не следует (.

+0

Благодарим за предложение. – yeyo

4

hol части соответствует \w+ части выражения, а [^(] части соответствует a. Часть входного сигнала ( игнорируется.

Добавить $ исправить проблему:

>> 'hola(' =~ /\w+[^(]$/ 
=> nil 
+0

Спасибо, вот и все. – yeyo

2

В этом примере регулярное выражение двигатель работает следующим образом: сканирование до hola, который соответствует \w+ часть, но следующий символ ( не соответствует [^(], то делает возвратов, и выяснить, что он соответствует, когда hol к \w+ часть, и a соответствует [^(] часть.


Вы можете подавить откаты с помощью (?>re) для независимых регулярных выражений:

'hola(' =~ /(?>\w+)[^(]/ 
# => nil 

или ++ повторения для притяжательного:

'hola(' =~ /\w++[^(]/ 
# => nil 

Оба рубин Regexp расширение.

+0

Я планировал использовать предложение Thorbear, но этот выглядит лучше. – yeyo

+0

sigh, Ruby only :(. Мне это очень нравится ответ, но я могу в конечном итоге использовать другие двигатели регулярных выражений в будущем. – yeyo