- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
需要一些帮助来创建满足以下规则的正则表达式。任何建议将不胜感激。
(1a.) 可以选择从以下内容开始: £,$,€
1b.货币值必须以一到三位数字开头
2a.逗号前:必须是一到三位数字
2b.逗号后:必须是三位数
2c。小数点后:只能是数字
3a.货币值必须以一位或多位数字结尾
[3b.] 值后面可以跟: tn/Tn/Trillion/万亿,bn/Bn/Billion/billion,m/Million/百万。
(3c.) 可选择以以下结尾: p/P/Pence/便士,c/C/Cents/cents,€/Euro(s)/euro(s),Dollars/dollars,Pounds/pounds。
规则 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]*
最佳答案
以下正则表达式不依赖于单独行上的值,但也会从句子中获取它们。
它还假设单位“cents”、“dollars”和“pounds”可以是单数。
此外,它允许单词和数字之间有无限的空格,并且数字和后面的值单词或单位之间没有空格。
解释:
以下是正则表达式的基本结构,子表达式由两个 @
包围的值表示:
(@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
是执行以下操作的条件语句:
如果第 1 组(前缀
)匹配,则将第 2 组(值
)添加到整体匹配中,前提是没有第 3 组(后缀
) 跟随它。
如果没有 Prefix
匹配,则将整体匹配设置为 Value
后跟 Postfix
当且仅当没有
。Value
之前的前缀
子表达式相当不言自明。 \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
@后缀@:
\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)
注意事项:
不会匹配出现在句子中后跟逗号或句号的值,如“$1”。 (例如,在句子This sentence is worth $1, $2 or $3.
中只匹配$2
。)
由带逗号和/或小数点的数字组成的值和允许使用值词,例如“10000亿”。
关于python - GBP/USD/EUR 的货币正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47285060/
我正在用 yacc/bison 编写一个简单的计算器。 表达式的语法看起来有点像这样: expr : NUM | expr '+' expr { $$ = $1 + $3; } | expr '-'
我开始学习 lambda 表达式,并在以下情况下遇到了以下语句: interface MyNumber { double getValue(); } MyNumber number; nu
这两个 Linq 查询有什么区别: var result = ResultLists().Where( c=> c.code == "abc").FirstOrDefault(); // vs. va
如果我们查看 draft C++ standard 5.1.2 Lambda 表达式 段 2 说(强调我的 future ): The evaluation of a lambda-expressio
我使用的是 Mule 4.2.2 运行时、studio 7.5.1 和 Oracle JDK 1.8.0_251。 我在 java 代码中使用 Lambda 表达式,该表达式由 java Invoke
我是 XPath 的新手。我有网页的html源 http://london.craigslist.co.uk/com/1233708939.html 现在我想从上面的页面中提取以下数据 完整日期 电子
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭10 年前。 Improve th
我将如何编写一个 Cron 表达式以在每天上午 8 点和下午 3:30 触发?我了解如何创建每天触发一次的表达式,而不是在多个设定时间触发。提前致谢 最佳答案 你应该只使用两行。 0 8 * * *
这个问题已经有答案了: What do 3 dots next to a parameter type mean in Java? (9 个回答) varargs and the '...' argu
我是 python 新手,在阅读 BeautifulSoup 教程时,我不明白这个表达式“[x for x in titles if x.findChildren()][:-1]”我不明白?你能解释一
(?:) 这是一个有效的 ruby 正则表达式,谁能告诉我它是什么意思? 谢谢 最佳答案 正如其他人所说,它被用作正则表达式的非捕获语法,但是,它也是正则表达式之外的有效 ruby 语法。 在
这个问题在这里已经有了答案: Why does ++[[]][+[]]+[+[]] return the string "10"? (10 个答案) 关闭 8 年前。 谁能帮我处理这个 JavaSc
这个问题在这里已经有了答案: What is the "-->" operator in C++? (29 个答案) Java: Prefix/postfix of increment/decrem
这个问题在这里已经有了答案: List comprehension vs. lambda + filter (16 个答案) 关闭 10 个月前。 我不确定我是否需要 lambda 或其他东西。但是,
C 中的 assert() 函数工作原理对我来说就像一片黑暗的森林。根据这里的答案https://stackoverflow.com/a/1571360 ,您可以使用以下构造将自定义消息输出到您的断言
在this页,John Barnes 写道: If the conditional expression is the argument of a type conversion then effec
我必须创建一个调度程序,它必须每周从第一天上午 9 点到第二天晚上 11 点 59 分运行 2 天(星期四和星期五)。为此,我需要提供一个 cron 表达式。 0-0 0-0 9-23 ? * THU
我正在尝试编写一个 Linq 表达式来检查派生类中的属性,但该列表由来自基类的成员组成。下面的示例代码。以“var list”开头的 Process 方法的第二行无法编译,但我不确定应该使用什么语法来
此 sed 表达式将输入字符串转换为两行输出字符串。两条输出行中的每一行都由输入的子串组成。第一行需要转换成大写: s:random_stuff\(choice1\|choice2\){\([^}]*
我正在使用 Quartz.Net 在我的应用程序中安排我的工作。我只是想知道是否可以为以下场景构建 CRON 表达式: Every second between 2:15AM and 5:20AM 最
我是一名优秀的程序员,十分优秀!