RegEx в Ruby: только один матч? - PullRequest
0 голосов
/ 27 января 2009

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

def single_match(test_me, regex)
  ret_val = false
  test = regex.match(test_me)
  if (test.length==1 && test[0].length == test_me.length)
      ret_val = true
  end
  return ret_val
end

Есть ли более простой способ сделать это?

P.S. Вот метод, который я действительно пытаюсь написать, так как люди, кажется, всегда спрашивают, почему я хочу пистолет в эти дни:

def is_int(test_me)
  return single_match(test_me, /[0-9]*/)
end

Редактировать Спасибо всем. Вот где я на самом деле использую это , но с этим регулярным выражением всегда интересно ознакомиться. Спасибо за великолепные и образовательные ответы.

Ответы [ 4 ]

7 голосов
/ 27 января 2009

Вам не нужно этого делать, ваш метод можно заменить с помощью регулярного выражения /^[0-9]*$/. ^ сообщает, что соответствует началу строки, а $ сообщает, что соответствует концу строки. Таким образом, оно будет соответствовать: начало строки, от 0 до любого в диапазоне от 0 до 9 и, наконец, конец строки.

def is_int(test_me)
  test_me =~ /^[0-9]*$/
end

И вам не нужны операторы return, Ruby неявно возвращает последний оператор.

Edit:

Вероятно, было бы проще и выглядело бы лучше использовать метод экземпляра to_i класса String.

def is_int(test_me)
  test_me.to_i.to_s == test_me
end

Редактировать: (сделал несколько тестов)

Сравнение производительности между двумя методами показывает, что .to_i.to_s == путь на 5% быстрее. Таким образом, все зависит от ваших личных предпочтений, которые когда-либо выглядят лучше, и если вы хотите обрабатывать лидирующие нули.

3 голосов
/ 27 января 2009

Делать то, что вы действительно хотите, должно быть еще проще

def is_int(test_me)
  test_me.to_i.to_s == test_me
end
2 голосов
/ 27 января 2009

Это

def single_match(str, regex)
  str.match(regex).to_s == str
end
1 голос
/ 27 января 2009

Чтобы ответить на ваш первоначальный вопрос, ради людей, которые находят эту страницу в поиске, «scan» вернет массив совпадений, поэтому, если вы хотите узнать, сколько раз совпадения выполняются некоторыми регулярными выражениями, например, сколько разрядов цифр вы можете сделать:

mystring.scan(/\d+/).size
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...