0

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

我有一个变量 ( price) 中的内容,我只想使用 match 来选择价格。我目前有以下内容:

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

4

2 回答 2

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,}1个或多个不带小数点的数字
    • (close paran 指示正则表达式停止返回任何其他匹配项。这个右括号与上面的左括号匹配
  • [)]匹配输入文本中的右括号
于 2013-05-01T16:03:32.853 回答
0

您可以尝试使用(?<=\(.)\d+\.?\d*(?=\)). 这将向前看和向后看,看看数字是否被包围()。您可以在此处查看对此的测试。

这是假设格式相同,(). 把它分解成更小的部分,你会得到:

  1. (?<=\(.)- a 后面是一个积极的表情,后面(跟着一个字符。该字符用于捕获用于货币的符号。如果您使用了特定的货币标记,则可以将 替换.为预期的符号。目前,数字开头和数字之间的任何符号(都可以使用。
  2. \d+\.?\d*- 查找数字的正则表达式。这会找到(至少)一个数字,后面可能跟着一个数字.和第二组数字。如果它不仅仅是一个偶数设置的“美元”金额,这应该处理包含在价格中的任何变化。根据您使用的任何货币的小数位数可以有多少位,您可以将第二个更改为\d*小数\d{x,y}位允许的位数介于x和之间y。因此,对于小数点后的 0 到 2 位数字,您将使用\d{0,2}.
  3. (?=\))- 积极展望确保正则表达式后跟一个).

这些一起有助于将正则表达式分解成更小的部分,这样您就可以了解不同的组件以及它们是如何工作的,而不仅仅是看到一个又大又长的可怕的正则表达式。

于 2013-05-01T14:50:32.877 回答