【问题标题】:RegEx pattern not matching php, but in c# / java / etcRegEx 模式不匹配 php,但在 c#/java/etc
【发布时间】:2012-10-11 20:23:04
【问题描述】:

我在 php 中遇到了正则表达式的问题。

得到以下模式:^\s*(\d{8})\s+(.+?)\s+(\d+,\d{2})\s.?\s(.*)$

我的搜索字符串是这样的: 12345678 这是一个小产品说明,带有一些特殊字符,例如 ® 16,00 €,也许这里有一些文字

我使用这个 php 代码:

$regex = '/^\s*(\d{8})\s+(.+?)\s+(\d+,\d{2})\s.?\s(.*)$/';
echo preg_match($regex, $input);

但是没有匹配!

java 或 c# 中的相同正则表达式模式有效!你能解释一下我做错了什么吗?

这里有一些在线正则表达式测试器:

PHP:http://regexp-evaluator.de/evaluator/d721ca1ed32d76db960262ba7298cff3/#ergebnis

Java:http://www.regexplanet.com/advanced/java/index.html

【问题讨论】:

标签: java php regex


【解决方案1】:

您缺少/u 修饰符。

在查找价格值 0,00 后,您的正则表达式会比较空格之间的单个字符 (.?)。但是欧元符号 通常占用两个字节。这仅适用于 UTF-8 模式。

【讨论】:

  • $regex = '/^\s*(\d{8})\s+(.+?)\s+(\d+,\d{2})\s.?\s(.*)$/u'; - 有效! +1
【解决方案2】:

如果不是多行模式,$ 只匹配完整字符串的结尾。如果 $input 中有换行符或更多数据,这可能是原因。在这种情况下,只需在最后的分隔符后面加上一个“m”即可。

我还想知道 (.+?) 是否正确。您是否尝试过 (.*)?

BurninLeo

【讨论】:

  • 您好,谢谢您的回复。我只搜索单行,因为在此代码 sn-p 前面,我将输入拆分为 \n 字符。组 (.+?) 是正确的,因为我不希望末尾有空格,所以我采用了非贪婪模式。
猜你喜欢
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-22
  • 2018-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多