2016-10-02 4 views
1

белое пространство либо пробел, знак табуляции или символ новой строки (т.е., возврат каретки или перевод строки)Как разбить на пробелы в Ocaml?

Я предполагаю, что \s охватывает , \t, \n, \r и \f

Но когда я попытался с помощью \s он не разбить строку правильно:

# let line1 = "We the People of the United States, in Order to form a more perfect";; 

# let wsp_regex = Str.regexp "\\s+";; 
# let words = Str.split wsp_regex line1;; 
val words : string list = 
["We the People of the United State"; ", in Order to form a more perfect"] 

# let wsp_regex = Str.regexp "[ \\s]+";; 
# let words = Str.split wsp_regex line1;; 
val words : string list = 
["We"; "the"; "People"; "of"; "the"; "United"; "State"; ","; "in"; "Order"; "to"; "form"; "a"; "more"; "perfect"] 

# let wsp_regex = Str.regexp "[\\s]+";; 
# let words = Str.split wsp_regex line1;; 
val words : string list = 
["We the People of the United State"; ", in Order to form a more perfect"] 

# let wsp_regex = Str.regexp "[ \\s\\t\\n\\r]+";; 
# let words = Str.split wsp_regex line1;; 
val words : string list =               
["We"; "he"; "People"; "of"; "he"; "U"; "i"; "ed"; "S"; "a"; "e"; ","; "i"; "O"; "de"; "o"; "fo"; "m"; "a"; "mo"; "e"; "pe"; "fec"] 

# let wsp_regex = Str.regexp "[\s]+";; 
Characters 29-31:                
Warning 14: illegal backslash escape in string.         
val wsp_regex : Str.regexp = <abstr> 

# let words = Str.split wsp_regex line1;; 
val words : string list =               
["We the People of the United State"; ", in Order to form a more perfect"] 

# let wsp_regex = Str.regexp "[ \s]+";; 
Characters 30-32:                
Warning 14: illegal backslash escape in string.         
val wsp_regex : Str.regexp = <abstr> 
# let words = Str.split wsp_regex line1;; 
val words : string list =               
["We"; "the"; "People"; "of"; "the"; "United"; "State"; ","; "in"; "Order"; "to"; "form"; "a"; "more"; "perfect"] 

# let wsp_regex = Str.regexp "[ \t\n\r\f]+";; 
Characters 36-38:                
Warning 14: illegal backslash escape in string.         
val wsp_regex : Str.regexp = <abstr> 
# let words = Str.split wsp_regex line1;; 
val words : string list =               
["We"; "the"; "People"; "o"; "the"; "United"; "States,"; "in"; "Order"; "to"; "orm"; "a"; "more"; "per"; "ect"] 

# let wsp_regex = Str.regexp "[\t\n\r\f]+";; 
Characters 35-37:                
Warning 14: illegal backslash escape in string.         
val wsp_regex : Str.regexp = <abstr> 
# let words = Str.split wsp_regex line1;; 
val words : string list =               
["We the People o"; " the United States, in Order to "; "orm a more per"; "ect"] 

Единственные случаи, которые, кажется, работает, являются:

# let wsp_regex = Str.regexp "[ ]+";; 
# let words = Str.split wsp_regex line1;; 
val words : string list =               
["We"; "the"; "People"; "of"; "the"; "United"; "States,"; "in"; "Order"; "to"; "form"; "a"; "more"; "perfect"] 

# let wsp_regex = Str.regexp "[ \t\n\r]+";; 
# let words = Str.split wsp_regex line1;; 
val words : string list =               
["We"; "the"; "People"; "of"; "the"; "United"; "States,"; "in"; "Order"; "to"; "form"; "a"; "more"; "perfect"] 

Я не знаю, почему второй случай работает потому, что делает [ \s]+ не работает (Ocaml думает, что я хочу разделить на или s)

Все, что я хочу, чтобы разделить на пробелы без использования только , потому что я также хочу взять \t, \n, \r и \f.

Однако я не могу понять, как создать выражение регулярных выражений в Ocaml для разделения на пробелы.

Если кто-то может предоставить мне рабочее выражение, которое было бы очень признательно!

ответ

4

В документации по Str module вы обнаружите, что \s не поддерживается. Итак, ваше первое выражение будет разделять слова на последовательности символов s. На самом деле это то, что вы видите.

Ни одна другая попытка с \s не сработает, так как \s не поддерживается.

Удивительно, но даже \n (двухсимвольное обозначение) не поддерживается как регулярное выражение. Поэтому, если вы хотите сопоставить новую строку, вам нужна фактическая строка новой строки в шаблоне регулярных выражений. Другими словами, вы хотите, чтобы строка имела это: "\n", не это: "\\n". То же самое верно для \r и \t.

Обозначение \f не принимается синтаксисом строки OCaml. Если вы хотите соответствовать формату, вам нужно использовать шестнадцатеричную нотацию \x0c.

Взяв все это вместе, ваш шаблон должен быть таким: "[ \n\r\x0c\t]+".

# Str.split (Str.regexp "[ \n\r\x0c\t]+") line1;; 
- : string list = 
["We"; "the"; "People"; "of"; "the"; "United"; "States,"; "in"; 
"Order"; "to"; "form"; "a"; "more"; "perfect"] 

Существует Perl-совместимый Regular Expression пакет, который вы могли бы найти более удобным в использовании: https://opam.ocaml.org/packages/pcre/pcre.7.1.5/

+0

благодарит вас !!! Я был так одурманен, почему это не работает, я ценю, что вы помогаете :) – 14wml