c# - 正则表达式匹配以单词、数字或罗马数字形式书写的数字

标签 c# regex numbers words roman-numerals

我正在尝试匹配以单词、数字或罗马数字形式书写的数字。这是一堆示例

CHAPTER 1
CHAPTER 2
CHAPTER THREE
CHAPTER IV
CHAPTER TWENTY TWO

我对正则表达式很不擅长,这就是我到目前为止所得到的。

(CHAPTER (([0-9]+)|(/* words - see below */)|( /* roman - see below */)))

// words
(TWENTY|THIRTY|etc)?( |-)?(ONE|TWO|THREE|FOUR|FIVE|etc)?

// roman
(I|II|III|IV|V|etc)+

该语句捕获 CHAPTER 1、CHAPTER 2 和 CHAPTER THREE,但尝试将 IV 作为单词进行匹配(我猜测它以某种方式匹配了 FIVE?)。二十二 根本不匹配。

有人可以帮忙吗?这是完整的正则表达式

(CHAPTER (
([0-9]+)|
((TWENTY|THIRTY)?( |-)?(ONE|TWO|THREE|FOUR|FIVE)?)|
((I|II|III|IV|V)+)
))

注意:

这样做的目的是将这些文本表示形式转换为实际的整数。我有针对每种情况执行此操作的方法,因此我确实需要区分各种情况

最佳答案

由于您已经有了解析器,如果给定的东西表面上看起来像有效的罗马/文本输入但实际上并非如此,那么解析器有望优雅地失败,您可以将它们全部调用并查看哪个通过。

如果您不想全部调用它们,则此正则表达式应识别将每个输入传递给哪个解析器。

var re = new Regex(
    @"CHAPTER (?:(?<arabic>\d+)|(?<roman>[IVXLCDM]+)|(?<text>[A-Z ]+))");

例如称为

var input = @"CHAPTER 1
CHAPTER 2
CHAPTER THREE
CHAPTER IV
CHAPTER TWENTY TWO";

foreach (Match match in re.Matches(input))
{
    if (match.Groups["arabic"].Success)
    {
        Console.WriteLine("Pass {0} to Arabic parser", match.Groups["arabic"].Value);
    }
    else if (match.Groups["roman"].Success)
    {
        Console.WriteLine("Pass {0} to Roman parser", match.Groups["roman"].Value);
    }
    else if (match.Groups["text"].Success)
    {
        Console.WriteLine("Pass {0} to Text parser", match.Groups["text"].Value);
    }
}

结果

Pass 1 to Arabic parser
Pass 2 to Arabic parser
Pass THREE to Text parser
Pass IV to Roman parser
Pass TWENTY TWO to Text parser

关于c# - 正则表达式匹配以单词、数字或罗马数字形式书写的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25942884/

相关文章:

java - 加权随机数 : boundary case

C++ 随机数 -100 到 100

java - 如何制作一个Java猜谜游戏程序

c# - 在 C# 和 iText 7 中使用 x509Certificate2 创建 IExternalSignature

c# - 在 asp.net MVC 中以英国格式将日期时间从 View 传递到 Controller

c# - C# 中有些复杂的正则表达式可以在没有前瞻/后瞻的情况下完成吗?如果不是怎么和他们相处呢?

Ruby 正则表达式组匹配,在 1 行上分配变量

c# - 从不同线程更新主窗口中的进度条

c# - 使用 FromSeed 自定义 AutoFixure 导致异常

javascript - 如何执行此正则表达式命令?