需要一些帮助来创建满足以下规则的正则表达式。如有任何建议,将不胜感激。
(1a.)可选择地以:£、$、欧元开头
1b.货币价值必须以1至3位数字开头。
2a.逗号前的:必须有1到3位数字
2b.逗号后面的:必须有三个数字
2c.小数点之后:只能有数字
3a.货币值必须以一个或多个数字结尾。
3b.值依次为:Tn/Tn/万亿/万亿、万亿/10亿/万亿、百万/百万/万亿。
(3c.)可选择以:P/P/pence/便士、c/C/美分/美分、欧元/欧元/euro(S)、美元/美元、英镑/英镑结束。
规则1a和3c是相互排斥的,但是必须使用其中之一:
$1 dollar ✘
1 ✘
$1 ✓
1 dollar ✓规则3b可与规则1a或3c一起使用,但不需要使用:
$1 trillion ✓
1 trillion dollars ✓
$1 ✓规则2a/2b可用于零或多次:
$1 ✓
$1,000,000,000,000 ✓规则2c只能使用一次或零次:
$1 ✓
$1.000 ✓预期结果:
$1 dollar ✘
1 ✘
$1,00000.000,000 ✘
1,000.00 ✘
$1 ✓
1 dollar ✓
$1 trillion ✓
1 trillion dollars ✓
$1,000,000,000,000 ✓
$1.000 ✓
$1,000,000,000,000.000000 ✓到目前为止,我的情况如下:
[£€$]?[0-9]+[,.]?[0-9][pcm][ euros| euro]*发布于 2017-11-14 16:45:59
下面的regex不依赖于分隔行上的值,但也会从一个句子中获取它们。
它还假定单位“美分”、“美元”和“英镑”可以是单数。
此外,它还允许单词和数字之间无限制的空白,并且在数字和下面的值字或单位之间也不允许空白。
解释:
下面是正则表达式的基本结构,其子表达式由两个@s包围的值表示:
(@Prefix@)?(?=(@Value@)(\s*@Postfix@)?)(?(1)\2(?!\3)|(?<!@Prefix@)\2\3)
|________| |_______||____________| |______________________________|
| | | |
Group 1 Group 2 Group 3 Prefix-Postfix Selector第1组可选择匹配前缀。
第2组和第3组是在前瞻性中捕获的,这样在执行Prefix-Postfix Selector时,只有第1组是整体匹配的一部分。
Prefix-Postfix Selector是一个条件语句,它执行以下操作:
Prefix)匹配,那么将第2组(Value)添加到整体匹配的当且仅当后面没有第3组(Postfix)。Prefix,那么将总体匹配设置为Value,然后设置为Postfix当且仅当在Value之前没有Prefix。这些子表达式是相当清楚的。\b确保整个单词是匹配的。同样,数字后面的负前瞻(?![\d.,])确保没有留下数字、逗号和小数点。
@前缀@:
[£€$]@Value:
\d{1,3}(?:,\d{3})*(?:\.\d+)?(?![\d.,])(?:\s*(?:[tTbB]n|m|(?:[tT]r|[bBmM])illion)\b)?
|_____||_________||________|| || |
|__________________________||________||____________________________________________|
| | |
Number, e.g. 12,345.6 | [[Whitespace] + Value Word, e.g. Tn or Billion]
|
Makes sure "1000" is not matched, for example@Postfix:
\s*(?:[pP](?:ence)?|[cC](?:ents?)?|€|[eE]uros?|[dD]ollars?|[pP]ounds?)\b解决方案:
用子表达式替换占位符将导致这个完整的正则表达式:
([£€$])?(?=(\d{1,3}(?:,\d{3})*(?:\.\d+)?(?![\d.,])(?:\s*(?:[tTbB]n|m|(?:[tT]r|[bBmM])illion)\b)?)(\s*(?:[pP](?:ence)?|[cC](?:ents?)?|€|[eE]uros?|[dD]ollars?|[pP]ounds?)\b)?)(?(1)\2(?!\3)|(?<![£€$])\2\3)警告:
$2中只有This sentence is worth $1, $2 or $3.匹配。)发布于 2017-11-14 12:46:13
要进行互斥管理,可以使用“货币符号分组”和“普通货币名称测试组”:
^([$£€])?\d{1,3}(?:,\d{3})*(?:\.\d+)?\s?(?:(?:[BMbm]|[Tt]r)(?:illion)?)?(?(1)|\s(?:(?:[Dd]ollar|[Pp]ound|[Ee]uro|[Cc]ent)s?|€|[Pp]ence))$https://stackoverflow.com/questions/47285060
复制相似问题