C# 正则表达式匹配以文字、数字或罗马数字形式书写的数字
我试着匹配一个写为单词、数字或罗马数字的数字。这是一堆样品C# 正则表达式匹配以文字、数字或罗马数字形式书写的数字,c#,regex,numbers,words,roman-numerals,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|e
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)+
该语句抓住了第1章、第2章和第3章,但试图将IV作为一个单词匹配(我猜它是否匹配第5个?)。22个根本不匹配
有人能帮忙吗?这是完整的正则表达式
(CHAPTER (
([0-9]+)|
((TWENTY|THIRTY)?( |-)?(ONE|TWO|THREE|FOUR|FIVE)?)|
((I|II|III|IV|V)+)
))
注:
其要点是将这些文本表示转换为实际整数。我有办法在每个案例中做到这一点,所以我需要在每个案例中做到这一点,我有办法在每个案例中做到这一点,我有办法在每个案例中做到这一点,所以我确实需要在各个案例中区分各个案例,所以我需要在各个案例中做到这一点,所以我需要在各个案例中区分不同的代码,所以我确实需要在各个案例中区分不同的代码>>代码>章节(?:::::::::xvivii124经经经经经经经经经经方方方周四周四周四周四周四周四周四周四124经经经经方周四周四周四周四周四周四周四124九九九九九九十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十十九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九九(?:(?:一|二|三|四|五|六|七|八|九))|(?:一、二、三、四、五、六、七、八、九、十、十一、十二、十三、十四、十五、十六、十七、十九)
CHAPTER (?:\d+|(?:XVIII|XVII|XIII|VIII|XIV|XVI|XII|III|VII|XV|VI|IV|XI|IX|XX|III|II|X|V|I)|(?:(?P<d>TWENTY|THIRTY|FORTY|FIFTY|SIXTY|SEVENTY|EIGHTY|NINETY)?(?(d)(?: (?:ONE|TWO|THREE|FOUR|FIVE|SIX|SEVEN|EIGHT|NINE))?|(?:ONE|TWO|THREE|FOUR|FIVE|SIX|SEVEN|EIGHT|NINE|TEN|ELEVEN|TWELVE|THIRTEEN|FOURTEEN|FIFTEEN|SIXTEEN|SEVENTEEN|EIGTHEEN|NINETEEN))))
分类和说明:
CHAPTER // match "CHAPTER " literally
(?:// then either:
\d+// 1: digits
|
(?:// or 2: roman numerals (up to 18) (note: make sure to order them by length!)
XVIII|XVII|XIII|VIII|XIV|XVI|XII|III|VII|XV|VI|IV|XI|IX|XX|III|II|X|V|I
)
|// or 3: words
(?:
(?P<d>// first, one of the literals "TWENTY", "THIRTY", etc...
TWENTY|THIRTY|FORTY|FIFTY|SIXTY|SEVENTY|EIGHTY|NINETY
)?// ...if possible
(?(d) // then, if the previous group matched...
(?: // ...a space...
(?:// ...and the numbers "ONE" to "NINE"
ONE|TWO|THREE|FOUR|FIVE|SIX|SEVEN|EIGHT|NINE
)
)?// ...if possible.
|
(?://otherwise, one of "ONE" to "NINETEEN"
ONE|TWO|THREE|FOUR|FIVE|SIX|SEVEN|EIGHT|NINE|TEN|ELEVEN|TWELVE|THIRTEEN|FOURTEEN|FIFTEEN|SIXTEEN|SEVENTEEN|EIGTHEEN|NINETEEN
)
)
)
)
CHAPTER//按字面意思匹配“CHAPTER”
(?://那么:
\d+//1:数字
|
(?://或2:罗马数字(最多18个)(注意:请确保按长度排序!)
十八|十七|十三|八|十四|十六|十二|三|七|十五|六|四|十一|九|二十|三|二|十|五|一
)
|//或3:文字
(?:
(?P//第一,字面值“二十”、“三十”等中的一个。。。
二十|三十|四十|五十|六十|七十|八十|九十
)?/…如果可能的话
(?(d)//然后,如果前一组匹配。。。
(?:/…一个空格。。。
(?:/…和数字“1”到“9”
一|二|三|四|五|六|七|八|九
)
)?/…如果可能的话。
|
(?://否则,从“一”到“十九”中的一个
一、二、三、四、五、六、八、九、十、十一、十二、十三、十四、十五、十六、十七、十九
)
)
)
)
既然你已经有了解析器,如果给定的东西表面上看起来像是有效的罗马/文本输入,但实际上不是,那么解析器很可能会失败,你可以把它们全部调用,看看是哪一个通过 如果您不想全部调用它们,这个正则表达式应该标识将每个输入传递给哪个解析器
var re = new Regex(
@"CHAPTER (?:(?<arabic>\d+)|(?<roman>[IVXLCDM]+)|(?<text>[A-Z ]+))");
导致
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
罗马数字的正则表达式是:
\bM{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})b
数字的正则表达式:
\d+
用于文本的正则表达式:
[a-z]+
将所有这些结合在一起:
CHAPTER (?:(?<digits>\d+)|(?<roman>\bM{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})\b)|(?<literal>[A-Z ]+))
章(?:(?\d+)|(?\bM{0,4}(CM|CD|d?C{0,3})(XC | XL | L?X{0,3})(IX | IV | V?I{0,3})|(?[A-Z]+)
您的第四章
在这里写为第五章
,感叹号vsI
。如果您的文件中是这样的,它将不匹配。除非需要显式写出这些内容,否则执行第章(\w+(?:\w+)会更容易
@BobKaufman在本例中是一个输入错误。在original@hwnd然后,我需要根据每种情况将它们转换为int。我有工作扩展方法来完成这项工作,但我需要首先找到哪个是哪个
CHAPTER (?:(?<digits>\d+)|(?<roman>\bM{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})\b)|(?<literal>[A-Z ]+))