【发布时间】:2013-03-04 14:26:49
【问题描述】:
我目前正在使用扫描仪和解析器,需要一个可以接受 ASCII 字母字符的解析器 - 所以我不能使用 char.isLetter。
我自己想出了两个解决方案。两个我都不喜欢。
正则表达式
def letter = elem("ascii letter", _.toString.matches("""[a-zA-Z]"""))
用正则表达式检查这样一个简单的事情似乎有点“矫枉过正”。
范围检查
def letter = elem("ascii letter", c => ('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z'))
在我看来,这将是 Java 的发展方向。但它不是真的可读。
对于这个问题,是否有更简洁、更类似于 Scala 的解决方案?我并不担心性能,因为在这种情况下并不重要。
【问题讨论】:
-
我觉得正则表达式没问题。如果担心性能,只需创建/保留正则表达式对象 .. 否则,提供性能测试用例。简单的正则表达式可以 fast (即使使用 toString)来应用;它们可以通过回溯退化,这在此处不适用。
-
我只是觉得这个正则表达式一点也不优雅。使用 Scala 时,感觉可以做很多非常棒的事情。但是这个好像不是这样的。
-
我觉得正则表达式很优雅,因为它是一种特定领域的语言,非常适合这个特定任务:描述特定字符串输入必须遵守的基于字符的语法。正则表达式不适用于很多事情,但除非现有方法或已知性能问题,否则我会使用正则表达式而不会三思而后行。跨度>