确保 OCaml 中的正则表达式匹配整个输入字符串的最佳方法是什么?
What is the best way to ensure a regex in OCaml matches the entire input string?
在 OCaml 中,我试图检查正则表达式是否匹配 整个 输入字符串,而不仅仅是前缀或后缀或第一个输入字符串之前的部分换行符。
例如,我想避免 [0-9]+
的正则表达式匹配如下字符串:
let negative_matches = [
" 123"; (* leading whitespace *)
"123 "; (* trailing whitespace *)
"123\n"; (* trailing newline *)
]
当尾随字符与模式不匹配时,我看到 Str.string_match
仍然 returns true
:
# List.map (fun s -> Str.string_match (Str.regexp "[0-9]+") s 0) negative_matches;;
- : bool list = [false; true; true]
将 $
添加到模式中有助于第二个示例,但 $
被记录为仅“匹配行尾”,因此第三个示例仍然匹配
# List.map (fun s -> Str.string_match (Str.reg exp "[0-9]+$") s 0) negative_matches;;
- : bool list = [false; false; true]
我没有看到真正的“字符串结尾”匹配器(如 Java 和 Ruby 中的 \z
),所以我找到的最佳答案是另外使用 Str.match_end
:
检查输入字符串的长度与匹配的长度
# List.map (fun s -> Str.string_match (Str.reg exp "[0-9]+") s 0 && Str.match_end () = String.length s) negative_matches;;
- : bool list = [false; false; false]
请告诉我我遗漏了一些明显的东西,还有更简单的方法。
编辑:请注意,我并不总是希望匹配像 [0-9]+
这样的简单正则表达式。我想要一种将任意正则表达式与整个输入字符串进行匹配的方法。
你错过了一些明显的东西。有一个更简单的方法。如果
[^0-9]
在输入字符串中匹配你会知道它包含一个non-digit字符。
不幸的是,我认为 Str
没有比您自己的解决方案或类似的、稍微更清晰的替代方案更好的方法来确保整个字符串已匹配:
Str.string_match (Str.regexp "[0-9]+") s 0 && Str.matched_string s = s
或者您可以只检查是否存在换行符,因为正如您所展示的那样,这是美中不足的地方。
当然,还有其他可用的正则表达式库没有这个问题。
试试这个作为你的例子
(?<![^A-z]|\w)[0-9]+(?![^A-z]|\w)
test it here
如果你想生成其他模式,你可以从了解这个开始
(?之前你想要的组')
(?!'任何你不希望它出现的组在你的愿望之后')
在 OCaml 中,我试图检查正则表达式是否匹配 整个 输入字符串,而不仅仅是前缀或后缀或第一个输入字符串之前的部分换行符。
例如,我想避免 [0-9]+
的正则表达式匹配如下字符串:
let negative_matches = [
" 123"; (* leading whitespace *)
"123 "; (* trailing whitespace *)
"123\n"; (* trailing newline *)
]
当尾随字符与模式不匹配时,我看到 Str.string_match
仍然 returns true
:
# List.map (fun s -> Str.string_match (Str.regexp "[0-9]+") s 0) negative_matches;;
- : bool list = [false; true; true]
将 $
添加到模式中有助于第二个示例,但 $
被记录为仅“匹配行尾”,因此第三个示例仍然匹配
# List.map (fun s -> Str.string_match (Str.reg exp "[0-9]+$") s 0) negative_matches;;
- : bool list = [false; false; true]
我没有看到真正的“字符串结尾”匹配器(如 Java 和 Ruby 中的 \z
),所以我找到的最佳答案是另外使用 Str.match_end
:
# List.map (fun s -> Str.string_match (Str.reg exp "[0-9]+") s 0 && Str.match_end () = String.length s) negative_matches;;
- : bool list = [false; false; false]
请告诉我我遗漏了一些明显的东西,还有更简单的方法。
编辑:请注意,我并不总是希望匹配像 [0-9]+
这样的简单正则表达式。我想要一种将任意正则表达式与整个输入字符串进行匹配的方法。
你错过了一些明显的东西。有一个更简单的方法。如果
[^0-9]
在输入字符串中匹配你会知道它包含一个non-digit字符。
不幸的是,我认为 Str
没有比您自己的解决方案或类似的、稍微更清晰的替代方案更好的方法来确保整个字符串已匹配:
Str.string_match (Str.regexp "[0-9]+") s 0 && Str.matched_string s = s
或者您可以只检查是否存在换行符,因为正如您所展示的那样,这是美中不足的地方。
当然,还有其他可用的正则表达式库没有这个问题。
试试这个作为你的例子
(?<![^A-z]|\w)[0-9]+(?![^A-z]|\w)
test it here 如果你想生成其他模式,你可以从了解这个开始
(?之前你想要的组')
(?!'任何你不希望它出现的组在你的愿望之后')