如何使用 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}))$");
按照我的算法,我编写的代码已经将有效的罗马数字转换为整数,但它需要对无效的罗马数字进行限制,这样 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}))$");