соответствие точной строки в Ocaml с помощью регулярных выражений - PullRequest
2 голосов
/ 30 декабря 2011

Как найти точное совпадение с помощью регулярного выражения в Ocaml? Например, у меня есть такой код:

let contains s1 s2 =
let re = Str.regexp_string s2
in
try ignore (Str.search_forward re s1 0); true
with Not_found -> false

, где s2 - это «_X_1», а s1 передает строки, такие как «A_1_X_1», «A_1_X_2», .... и т. Д., В функцию «содержит». Цель состоит в том, чтобы найти точное соответствие, когда s1 равен "A_1_X_1". Но текущий код находит совпадение, даже когда s1 имеет значение «A_1_X_10», «A_1_X_11», «A_1_X_100» и т. Д.

Я пробовал с "[_x_1]", "[_X_1] $" как s2 вместо "_X_1", но, похоже, не работает. Может кто-нибудь подсказать, что может быть не так?

Ответы [ 3 ]

3 голосов
/ 31 декабря 2011

Вы можете использовать метасимвол $, чтобы соответствовать концу строки (который, если строка не содержит нескольких строк, является концом строки). Но вы не можете пройти через это Str.regexp_string; это просто ускользает от метасимволов. Сначала вы должны заключить в кавычку фактическую часть подстроки, а затем добавить $, а затем сделать регулярное выражение из этого:

let endswith s1 s2 =
  let re = Str.regexp (Str.quote s2 ^ "$")
  in
  try ignore (Str.search_forward re s1 0); true
  with Not_found -> false
2 голосов
/ 30 декабря 2011

Str.match_end - это то, что вам нужно:

let ends_with patt str =
  let open Str in
  let re = regexp_string patt in
  try
    let len = String.length str in
    ignore (search_backward re str len);
    match_end () == len
  with Not_found -> false

При этом определении функция работает так, как вам нужно:

# ends_with "_X_1" "A_1_X_10";;
- : bool = false
# ends_with "_X_1" "A_1_X_1";;
- : bool = true
# ends_with "_X_1" "_X_1";;
- : bool = true
# ends_with "_X_1" "";;
- : bool = false
0 голосов
/ 30 декабря 2011

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

Вам необходимо привязать регулярное выражение: ^_X_1$.

Кроме того, [_x_1] не будетhelp: [...] - это класс символов, здесь вы просите, чтобы механизм регулярных выражений соответствовал символу x, 1 или _.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...