如何匹配单词组中的任何单词

时间:2011-07-12 12:39:54

标签: regex

我正在尝试创建一个能识别字符串中的钱的模式。到目前为止我的表达是:

(\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'等等,而不是单个字母?

3 个答案:

答案 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)?

对于未来,对于正则表达式的问题,如果您发布一个典型的输入字符串和所需的匹配以及您的问题,这将非常有用!