我正在尝试匹配以单词、数字或罗马数字形式书写的数字。这是一堆示例
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/