如何使用 RegExp 在 Dart 中测试有效的罗马数字字符串?

How do I use RegExp to test a valid String of Roman Numeral in Dart?

按照我的算法,我编写的代码已经将有效的罗马数字转换为整数,但它需要对无效的罗马数字进行限制,这样 IIII 就会无效,而不是返回整数 4。

我已经在 python 中编写了 RegExp 代码:

valid = bool(re.search(r"^M{0,3}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$",RomanString))
if valid:
   executes convertion...

Dart 的 RegExp 模式更接近 Javascript 而不是 python,因为在 Dart 中打印时 RegExp 的 runTimeType 是 JSSyntaxRegExp。 来源给出了用于在 Javascript 中验证罗马数字的 RegExp 为:

export const isRoman = (string) => {
    // regex pattern
    const pattern = /^(M{1,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})|M{0,4}(CM|C?D|D?C{1,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})|M{0,4}(CM|CD|D?C{0,3})(XC|X?L|L?X{1,3})(IX|IV|V?I{0,3})|M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|I?V|V?I{1,3}))$/
    return pattern.test(string);
};

但是dart中没有.test校验String的函数。可用的没有带来想要的result/do 不起作用

 String? numeral = 'iv'.toUpperCase(); ///This should be valid ///
 var pattern =  RegExp(r"/^(M{1,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})|M{0,4}(CM|C?D|D?C{1,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})|M{0,4}(CM|CD|D?C{0,3})(XC|X?L|L?X{1,3})(IX|IV|V?I{0,3})|M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|I?V|V?I{1,3}))$");
print(pattern.hasMatch(numeral)); ///Prints false irrespective of String input

无法匹配字符串开头前的斜杠。

使用

var pattern =  RegExp(r"^(?:M{1,4}(?:CM|CD|D?C{0,3})(?:XC|XL|L?X{0,3})(?:IX|IV|V?I{0,3})|M{0,4}(?:CM|C?D|D?C{1,3})(?:XC|XL|L?X{0,3})(?:IX|IV|V?I{0,3})|M{0,4}(?:CM|CD|D?C{0,3})(?:XC|X?L|L?X{1,3})(?:IX|IV|V?I{0,3})|M{0,4}(?:CM|CD|D?C{0,3})(?:XC|XL|L?X{0,3})(?:IX|I?V|V?I{1,3}))$");