正则表达式 - 从固定模式中排除符号

时间:2014-10-03 08:41:46

标签: php regex

我需要一些正则表达专家的帮助。

我有一个脚本,它给出了一个固定的模式列表。使用非常简单的正则表达式,我在目标文本中搜索模式存在。例如:

/.*TFT.*/
/.*LCD.*/
/.*ANTI-GLARE.*/

那些字符串 - TFT,LCD,ANTI-GLARE是固定的 - 我无法修改它们。好吧,问题出在ANTI-GLARE中 - 破折号将导致不匹配AntiGlare。我知道我这样做的正则表达式是这样的:

/.*ANTI-?GLARE.*/

这将匹配两种变体,但我无法修改该字符串。我的问题是: 是否有另一种方法使符号可选,而不是模式中的感叹号?

编辑 - 清除

经过一些答案和提示后,我会尝试对我的问题进行更具体的描述。 我在表格中有一个字符串:

Anti Glare

TFT
AntiGlare
LCD

通过XML我收到了一个新的模型,描述如下:

  

防眩

我需要确保 - 我是否有#34; Anti Glare"喜欢描述。我无法改变收到的Anti-Glare,因为有很多字符串 - 范围广泛 - 在正则表达式中构建逻辑组或任何类似的组合都是不可能的。它使用php脚本构建,如:

$rexp="/.*~.*/i"; 
  • 其中〜被替换为该字符串。

    $ rexp = str_replace函数('〜',$ rexp,$ COND);

  • 其中$ cond持有当前收到的字符串

    操作员可以改变〜之外的任何部分,但不能改变〜内容 - 会有数以千计

2 个答案:

答案 0 :(得分:2)

你正在使用php,所以我们可以假设你有一个类似于接受每个字符串的数组。

这是一种做你想做的事情,如果只是打扰你:

<?php

$words = array('TFT', 'LCD', 'ANTI-GLARE');
$pattern = '/(' . str_replace('-', '-?', implode($words, '|')) . ')/i';

?>

这会生成模式/(TFT|LCD|ANTI-?GLARE)/iwhich will fit your needs

修改

如评论中所述,您收到了所有可能的字符串:TFT;LCD;AntiGlare;Anti-Glare;Anti Glare。然后你只需要用管道连接它们(正则表达式中的OR运算符)并用括号括起整个块:

$words = array('TFT', 'LCD', 'AntiGlare', 'Anti-Glare', 'Anti Glare');
$pattern = '/(' . implode($words, '|') . ')/i';

这将生成模式/(TFT|LCD|AntiGlare|Anti-Glare|Anti Glare)/i

答案 1 :(得分:1)

好吧,你不能修改那些正则表达式,但我想你可以修改文本。所以,你可以这样做。

使用带有大小写不敏感标志的正则表达式/antiglare/,然后将其替换为ANTI-GLARE。我希望这对你有用。我不能给你代码,因为我不知道php。