价格正则表达与其他数字混合

时间:2013-05-01 14:41:02

标签: javascript regex match

尝试编写一些JavaScript正则表达式以匹配从下拉列表中选择选项时的价格。示例输出:Acrylic Print 12 x 16 inch (£95)

我将内容放在变量(price)中,我只想在此处使用匹配来选择价格。我目前有以下内容:

price = price.match(/[\d\.\d]+/i)

这得到了12而不是95.

任何帮助将不胜感激。

干杯,

更改1

尝试HamZaDzCyber​​DeV'建议:

price.match(/(?<=£)\d+(?:\.\d+)?/)

返回以下错误。

Uncaught SyntaxError: Invalid regular expression: /(?<=�)d+(?:.d+)?/: Invalid group

对不起,不知道我在RegEx方面做了什么。每次都让我难过。

更改2

.match(/(?<=\(.)\d+\.*\d*(?=\))/i)

错误:

Uncaught SyntaxError: Invalid regular expression: /(?<=\(.)\d+\.*\d*(?=\))/: Invalid group

2 个答案:

答案 0 :(得分:1)

考虑以下PowerShell通用正则表达式的例子。

  • [(][^0-9.]?([.][0-9]{1,2}|[0-9]{1,}[.][0-9]{1,2}|[^.][0-9]{1,})[)]任何单个非数字前导字符都将被忽略
  • [(][£$]([.][0-9]{1,2}|[0-9]{1,}[.][0-9]{1,2}|[^.][0-9]{1,})[)]必须具有已知的货币符号

实施例

$Matches = @()
$String = 'Acrylic Print 12 x 16 inch (£95)  (£95.03)  (£95......00) (90)  (23.45) (£95.06) (.1) (.22)  (.) (£.24)  (£.)'
Write-Host start with 
write-host $String
Write-Host
Write-Host any valid decimal number inside parans
([regex]'[(][^0-9.]?([.][0-9]{1,2}|[0-9]{1,}[.][0-9]{1,2}|[^.][0-9]{1,})[)]').matches($String) | foreach {
    write-host "at $($_.Groups[1].Index) = '$($_.Groups[1].Value)'"
    } # next match
Write-Host
Write-Host Only decimal number inside parans where the number is preceeded by a known symbol
 ([regex]'[(][£$]([.][0-9]{1,2}|[0-9]{1,}[.][0-9]{1,2}|[^.][0-9]{1,})[)]').matches($String) | foreach {
    write-host "at $($_.Groups[1].Index) = '$($_.Groups[1].Value)'"
    } # next match

产量

start with
Acrylic Print 12 x 16 inch (£95)  (£95.03)  (£95......00) (90)  (23.45) (£95.06) (.1) (.22)  (.) (£.24)  (£.)

any valid decimal number inside parans
at 29 = '95'
at 36 = '95.03'
at 59 = '90'
at 65 = '23.45'
at 74 = '95.06'
at 82 = '.1'
at 87 = '.22'
at 99 = '.24'

Only decimal number inside parans where the number is preceeded by a known symbol
at 29 = '95'
at 36 = '95.03'
at 74 = '95.06'
at 99 = '.24'

摘要

  • [(]匹配输入文本中的空心括号
  • [£$]匹配单个£或$符号
  • [^0-9]?部分允许您查找任何非数字,例如£符号。这可能是也可能不存在于源字符串
  • 正则表达式部分([.][0-9]{1,2}|[0-9]{1,}[.][0-9]{1,2}|[^.][0-9]{1,})找到并返回所有有效数字,这些数字也可能包含小数点后跟2位数。这不会只返回“。”
    • (指示正则表达式返回在此开括号与下面的括号之间找到的任何内容
    • [.][0-9]{1,2}在小数点后面找到1或2个数字
    • |
    • [0-9]{1,}[.][0-9]{1,2}小数点前有1个或更多数字后跟1或2个数字
    • |
    • [^.][0-9]{1,}一个或多个不遵循小数点的数字
    • ( close paran指示正则表达式停止返回任何其他匹配。这个紧密的括号与上面的空括号配对
  • [)]匹配输入文本中的近括号

答案 1 :(得分:0)

您可以尝试使用(?<=\(.)\d+\.?\d*(?=\))。这将展望未来并查看数字是否被()包围。您可以看到此here的测试。

这假设格式相同,()内没有空格。 把它分解成更小的碎片:

  1. (?<=\(.) - (后面跟着一个字母的正面看法。这个字符用于捕获用于货币的符号。如果您使用了特定的货币标记,则可以将.替换为预期的符号。目前,(和数字开头之间的任何符号都可以使用。
  2. \d+\.?\d* - 查找数字的正则表达式。这找到(至少)一个数字,可能后跟.和第二组数字。如果它不仅仅是一个偶数设置的“美元”金额,它应该处理捕获价格中包含的任何变化。根据您使用的任何货币的小数位数,您可以将第二个\d*更改为\d{x,y},其中小数位数允许的位数在x之间y。因此,对于小数点后的0到2位数,您将使用\d{0,2}
  3. (?=\)) - 展望未来,确保正则表达式后跟)
  4. 这些有助于将正则表达式分解为更小的部分,这样您就可以了解不同的组件及其工作方式,而不仅仅是看到一个很长的可怕的正则表达式。