【问题标题】:How to detect if string contains only latin symbols using Ruby 1.9?如何使用 Ruby 1.9 检测字符串是否仅包含拉丁符号?
【发布时间】:2012-11-20 05:14:52
【问题描述】:

我需要检测某个字符串是否包含非拉丁字母表中的符号。 -_+ 等数字和特殊符号都很好。我需要知道是否有任何非拉丁符号。例如:

"123sdjjsf-4KSD".just_latin?

应该返回true

"12333ыц4--sdf".just_latin?

应该返回false

【问题讨论】:

  • 像 éöã&$ 这样的字符呢?
  • Latin 到底是什么意思?

标签: ruby regex ascii


【解决方案1】:

我认为这应该适合你:

 # encoding: UTF-8

 class String
   def just_latin?
     !!self.match(/^[a-zA-Z0-9_\-+ ]*$/)
   end
 end

 puts "123sdjjsf-4KSD".just_latin?
 puts "12333ыц4--sdf".just_latin?

请注意,*#ascii_only?* 也非常接近您想要的。

【讨论】:

    【解决方案2】:

    以下正则表达式将匹配一个非拉丁字母字符:

    [\p{L}&&[^a-zA-Z]]
    

    && 语法与两个字符类相交。第一个 (\p{L}) 匹配任何 Unicode 字母。第二个^a-zA-Z 匹配任何 (^) 拉丁字符(a-zA-Z)。 IE。整个字符类匹配任何非拉丁字母。

    See it working on Rubular.

    因此,如果您在 just_latin? 中使用此正则表达式并在未找到匹配项时返回 true,它应该可以按照您的意愿工作。

    我之前尝试将 Unicode 属性 \p{Latin} 用于第二个字符类,但这并不完全可靠,因为 \p{Latin} 包括例如冰岛字符 þæð

    【讨论】:

      【解决方案3】:

      好了,只要匹配这些字符就完成了(a-z 表示从az 的字符):^[a-zA-Z_\-+]+$

      【讨论】:

      • 嗯,他说那些字母加上那些符号。关于锚点,如果他在整个字符串上都需要它,我认为不需要它们。
      • 第二个输入字符串将与您的模式匹配。一次在12333 和一次在4--sdf。这就是为什么你需要锚来防止匹配。关于其他角色。他说“特殊符号……”,但我想这是有争议的。当然,如果 OP 有一个他想要允许的特定字符列表,那么您的模式(带有锚点)就是要走的路。
      猜你喜欢
      • 2017-12-16
      • 2010-12-27
      • 2016-05-19
      • 1970-01-01
      • 1970-01-01
      • 2012-01-05
      • 2018-09-03
      • 1970-01-01
      • 2011-04-04
      相关资源
      最近更新 更多