英文数字的可扩展正则表达式

2024-03-18

我正在尝试创建一个正则表达式认出 英文数字 http://en.wikipedia.org/wiki/Names_of_numbers_in_English, 例如one, nineteen, twenty, 一百二十二, 等等,一直到数百万。我想要reuse正则表达式的某些部分,因此正则表达式是由部分构造的,如下所示:

// replace <TAG> with the content of the variable
ONE_DIGIT = (?:one|two|three|four|five|six|seven|eight|nine)
TEEN = (?:ten|eleven|twelve|(?:thir|for|fif|six|seven|eigh|nine)teen)
TWO_DIGITS = (?:(?:twen|thir|for|fif|six|seven|eigh|nine)ty(?:\s+<ONE_DIGIT>)?|<TEEN>)
// HUNDREDS, et cetera

我想知道是否有人已经做了同样的事情(并且愿意分享),因为这些正则表达式很长,并且它们可能有一些不应该的东西,或者我可能缺少的东西。另外,我希望他们成为高效的尽可能所以我期待任何优化技巧。我正在使用 Java 正则表达式引擎,但任何正则表达式风格都是可以接受的。


参见 Perl 的Lingua::EN::Words2Nums http://search.cpan.org/perldoc/Lingua::EN::Words2Nums and Lingua::EN::FindNumber http://search.cpan.org/perldoc/Lingua::EN::FindNumber.

特别是,源代码Lingua::EN::FindNumber http://cpansearch.perl.org/src/TMTM/Lingua-EN-FindNumber-1.2/lib/Lingua/EN/FindNumber.pm包含:

# This is from Lingua::EN::Words2Nums, after being thrown through
# Regex::PreSuf
my $numbers =
    qr/((?:b(?:akers?dozen|illi(?:ard|on))|centillion|d(?:ecilli(?:ard|on)|ozen|u(?:o(?:decilli(?:ard|on)|vigintillion)|vigintillion))|e(?:ight(?:een|ieth|[yh])?|leven(?:ty(?:first|one))?|s)|f(?:i(?:ft(?:een|ieth|[yh])|rst|ve)|o(?:rt(?:ieth|y)|ur(?:t(?:ieth|[yh]))?))|g(?:oogol(?:plex)?|ross)|hundred|mi(?:l(?:ion|li(?:ard|on))|nus)|n(?:aught|egative|in(?:et(?:ieth|y)|t(?:een|[yh])|e)|o(?:nilli(?:ard|on)|ught|vem(?:dec|vigint)illion))|o(?:ct(?:illi(?:ard|on)|o(?:dec|vigint)illion)|ne)|qu(?:a(?:drilli(?:ard|on)|ttuor(?:decilli(?:ard|on)|vigintillion))|in(?:decilli(?:ard|on)|tilli(?:ard|on)|vigintillion))|s(?:core|e(?:cond|pt(?:en(?:dec|vigint)illion|illi(?:ard|on))|ven(?:t(?:ieth|y))?|x(?:decillion|tilli(?:ard|on)|vigintillion))|ix(?:t(?:ieth|y))?)|t(?:ee?n|h(?:ir(?:t(?:een|ieth|y)|d)|ousand|ree)|r(?:e(?:decilli(?:ard|on)|vigintillion)|i(?:gintillion|lli(?:ard|on)))|w(?:e(?:l(?:fth|ve)|nt(?:ieth|y))|o)|h)|un(?:decilli(?:ard|on)|vigintillion)|vigintillion|zero|s))/i;

Perl 的艺术许可 http://dev.perl.org/licenses/artistic.html.

您可以使用正则表达式::PreSuf http://search.cpan.org/perldoc/Regex::PreSuf自动分解常见的前缀和后缀:

#!/usr/bin/perl

use strict;
use warnings;

use Regex::PreSuf;

my %singledigit = (
    one    => 1,
    two    => 2,
    three  => 3,
    four   => 4,
    five   => 5,
    six    => 6,
    seven  => 7,
    eight  => 8,
    nine   => 9,
);

my $singledigit = presuf(keys %singledigit);

print $singledigit, "\n";

my $text = "one two three four five six seven eight nine";

$text =~ s/($singledigit)/$singledigit{$1}/g;

print $text, "\n";

Output:



C:\Temp> cvb
(?:eight|f(?:ive|our)|nine|one|s(?:even|ix)|t(?:hree|wo))
1 2 3 4 5 6 7 8 9
  

恐怕此后会变得更难;-)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

英文数字的可扩展正则表达式 的相关文章

随机推荐

  • git 可以配置为不对某些文件执行 autocrlf 吗?

    我在一个部署到 Windows Linux 和 Mac 客户端的 Java 项目上使用 git 对于这个 Java 项目 我还维护 sh 脚本 用于在 Mac Linux 上运行编译后的二进制文件 exe 用于在 Windows 上运行编译
  • 生成多个pandas数据框

    我正在从网站检索 csv 格式的多个数据框 我将数据帧保存在一个空列表中 然后一一读取 我无法将它们附加到单个数据框中 因为它们具有不同的列名称和列顺序 所以我有以下问题 我可以在用于读取文件的循环内创建一个具有不同名称的数据框 这样我就可
  • MinGW 的 msvcrt 替代品? (例如,获得符合要求的 snprintf)

    所以这是一个有趣的 我们有一些 C 库should与平台无关 即使它们是在 Linux 上开发的 因为它们仅依赖于 ISO IEC 9899 1999 中定义的 C 标准库 当我们用 MinGW 编译这些库时 一开始一切似乎都工作正常 但今
  • 这是什么类型的图表?可以使用 ggplot2 创建它吗?

    我有这张图表 我正在尝试复制 它有两个 X 轴和 Y 轴连续变量 并用一条线绘制这两个变量之间随时间变化的关系 我的问题有两个部分 首先 这种类型的图表叫什么 这是不寻常的 因为点之间的线是由第三个变量 年份 决定的 而不是它们在 X 轴上
  • SQL Server集成身份验证模式

    我想知道何时在 Web 应用程序的连接字符串中使用 Windows 身份验证模式 应用程序本身使用 Windows 身份验证进行授权 将使用哪个帐户登录 SQL Server 不是web应用程序池帐号吗 使用 Windows 身份验证登录
  • 突然间无法再在 IntelliJ 中运行 Kotlin 测试

    我有一个大型 Kotlin 项目 其中包含为 KotlinTest 编写的大约 2500 个单元测试 该项目是一个 Gradle 项目 我能够从 Gradle 任务运行所有测试 但通常我从编辑器运行它们 我可以通过单击 运行 图标从编辑器运
  • 运行 android 时出错:Gradle 项目同步失败。请修复您的项目并重试

    Android Studio 1 2 RC0 不断告诉我Error running android Gradle project sync failed Please fix your project and try again 我怎样才能
  • 远程 Web 应用程序调试在 ios 8 beta 中不起作用

    我正在尝试在模拟器上调试 ios 8 beta 下的 Web 应用程序 运行最新版本的 safari 版本 7 0 6 和 Xcode 但我在 safari 中只能看到 没有可检查的应用程序 有什么建议 您需要最新的 Safari 每晚版本
  • 无法在 Web 服务器上启动调试。 Web 服务器找不到所请求的资源

    我在尝试调试 ASP NET MVC 应用程序时遇到此错误 我已将应用程序设置为 使用本地 IIS Web 服务器 并选择 ASP NET 作为调试器 在不进行调试的情况下运行该网站效果很好 但是当我尝试调试时 出现以下错误 Unable
  • Python 文件操作

    我用这个 python 程序得到了一个错误 IOError Errno 0 Error from sys import argv file open test txt a print file tell not at the EOF pla
  • groupByKey(...) 中的 类在其成员中有一个 Map。 groupByKey 操作因“不可比较”问题而失败

    我有课Entreprise具有基元数据类型和另一个类上的 Map Etablissement它仅由原始数据类型组成 public class Entreprise implements Comparable
  • FnBox 示例抛出错误:盒装中没有 FnBox?

    我尝试运行FnBox示例来自官方文档 https doc rust lang org 1 27 0 std boxed trait FnBox html但它会抛出一个错误 error E0432 unresolved import std
  • Android 蓝牙 Le 扫描仪在一段时间后停止

    我正在使用活动的蓝牙 LE 扫描仪运行应用程序或服务 并在日志控制台上显示扫描结果 如果我把手机锁在桌子上不再碰 一段时间后它停止了 并且没有给我更多的扫描结果 如果我按下电源按钮并且屏幕唤醒 它会给我更多扫描结果 如果我再次锁定屏幕或等待
  • 在 macOS 上通过终端启动 Spyder 时出现 kq_init 警告

    我在 Mac 上运行 Spyder High Sierra 我有 2 个使用 Anaconda 定义的虚拟环境 对于 python 2 7 13 虚拟环境是 py27 对于 python 3 65 虚拟环境是 py36 当我转到 py36
  • 使用 dup2 时的竞争条件

    这个联机帮助页 http linux die net man 2 dup2为了dup2系统调用说 EBUSY 仅限 Linux 这可能会在执行期间由 dup2 或 dup3 返回 open 2 和 dup 的竞争条件 它谈论什么竞争条件以及
  • Chart_Series() 是否适用于对数轴?

    有没有办法产生对数 y 轴chart Series 我正在使用实验chart Series 而不是chartSeries 中的方法quantmod 因为在绘图中添加额外的线时更方便 library quantmod POWR lt getS
  • Qt:如何检测是否选择了某个小部件?

    我没有看到任何信号 槽 函数可以告诉我鼠标是否选择了某个小部件 是否可以有这样一个函数来告诉我当前的QWidget是否被选中 我如何区分 当前小部件被选择 和 其子小部件之一被选择 您可以使用以下命令检查小部件的焦点hasFocus 功能
  • C++ 中的 Bron Kerbosch 算法

    我一直在练习我的 C 算法知识 并陷入了标准 BK 实现 该算法输出了太多的派系 我似乎不明白为什么 我将图表示为邻接列表 vector lt list
  • 应用程序未与 iCloud 同步核心数据更改

    我设置了一些 NSLogs 以确保我的应用程序与 iCloud 同步更改 但我已经等了半个小时并且更改没有同步 这是我的核心数据代码 核心数据存储存储在文档目录中 因为我希望它在失去对 iCloud 的访问时能够继续工作 并且不希望它在这种
  • 英文数字的可扩展正则表达式

    我正在尝试创建一个正则表达式认出 英文数字 http en wikipedia org wiki Names of numbers in English 例如one nineteen twenty 一百二十二 等等 一直到数百万 我想要re