我正在尝试创建一个能识别字符串中的钱的模式。到目前为止我的表达是:
(\d{1,3}[\.,\s]{0,2})*\d{3}[\.,\s]{0,2}\d{0,2}[\s]{0,2}[zl|zł|zlotych|złotych|pln|PLN]{0,1}
我的主要问题是最后一部分:[zl |zł| zlotych |złotych| pln | PLN],它应该找到一个有关货币价值的国家符号(就像美元或美元或美元一样)但是我我做错了,因为它也匹配'108.1 z'之类的东西。
是否可以改变最后一部分,以便它只匹配包含整个表达式的表达式,如'zl',' pln'等等,而不是单个字母?
答案 0 :(得分:4)
是的,请勿使用定义字符类的[]
,而是使用()
对字词进行分组。
(\d{1,3}[\.,\s]{0,2})*\d{3}[\.,\s]{0,2}\d{0,2}[\s]{0,2}(zl|zł|zlotych|złotych|pln|PLN)?
正如您所写,[zl|zł|zlotych|złotych|pln|PLN]
,表示“匹配[]
”中包含的任何字符,或相当于:[zl|łotychpnPLN]
(已删除重复项)
如果您不想捕获货币符号,请使用?:
启动组,即:
(\d{1,3}[\.,\s]{0,2})*\d{3}[\.,\s]{0,2}\d{0,2}[\s]{0,2}(?:zl|zł|zlotych|złotych|pln|PLN)?
答案 1 :(得分:2)
使用括号(分隔groups)而不是方括号(分隔character classes)围绕最后一组。
作为一种风格,使用?而不是{0,1}。
(\d{1,3}[\.,\s]{0,2})*\d{3}[\.,\s]{0,2}\d{0,2}[\s]{0,2}(zl|zł|zlotych|złotych|pln|PLN)?
答案 2 :(得分:0)
这里有一些问题。首先,内部[]
字符被视为文字,因此前两个[]
块应为[.,\s]
。
接下来(正如其他答案所说),最后一个[]
块需要是一个组,而不是一个字符类,所以用[]
替换()
。
最后,最后您可以将{0, 1}
替换为?
。它不会有所作为,但它更整洁。
正则表达式应如下所示:
(\d{1,3}[.,\s]{0,2})*\d{3}[.,\s]{0,2}\d{0,2}[\s]{0,2}(zl|zł|zlotych|złotych|pln|PLN)?
对于未来,对于正则表达式的问题,如果您发布一个典型的输入字符串和所需的匹配以及您的问题,这将非常有用!