2012-01-25 23 views
1

我想创建一个正则表达式,以便当我将字符串与字符串数组进行比较时,匹配与正则表达式一起返回而忽略某些字符。是否有可能在与正则表达式匹配时忽略字符串中的字符

下面是一个例子。考虑名字的下面的数组:

{ 
    "Andy O'Brien", 
    "Bob O'Brian", 
    "Jim OBrien", 
    "Larry Oberlin" 
} 

如果用户输入“肥胖”,我想应用到正则表达式谓词应用到阵列以及上述所有阵列中的名称将匹配(例如: '被忽略)。

我知道我可以两次运行匹配,首先针对每个名称,然后针对每个名称使用从字符串中去除的忽略字符。我宁愿这个由一个正则表达式完成,所以我不需要两次通过。

这可能吗?这是针对iOS应用的,我使用的是NSPredicate。

编辑:澄清使用

从最初的答案,我意识到,我并不清楚。上面的例子是一个特定的例子。我需要一个通用的解决方案,其中名称数组是一个具有不同名称的大型数组,我匹配的字符串由用户输入。所以我不能像[o]'[b]那样硬编码正则表达式。

此外,我知道如何做不区分大小写的搜索,所以不需要专注于此的答案。只需要一个解决方案来忽略我不想匹配的字符。

回答

4

既然你已经丢弃显示这是可以做到的方式所有的答案,你留下了答案:

NO,这不能做。正则表达式没有“忽略”字符的选项。你唯一的选择是修改正则表达式来匹配它们,或者对你的源文本进行传递以摆脱你想忽略的字符,然后与之匹配。 (当然,那么你可能会遇到将你的'清理'文本与实际源文本关联的问题。)

+0

我发现一个合理的解决方案给予我的实现,通过源通过消除我不想匹配的字符的变化。感谢您的输入。 – XJones

+0

这对我来说似乎过分了。为什么不采用搜索字符串,并指出“忽略”字符可能在每个字符后出现0或1次?例如,如果用户输入字符串“oleary”,则可以将其转换为正则表达式“o'?l'?e'?a'?r'?y'?'。我想这会对性能产生负面影响,但我不明白为什么它不起作用。 – octern

+0

这就是问题所在。这是一段需要尽可能快的代码。我现在的解决方案在这方面似乎很好。谢谢。 – XJones

2

如果我理解正确,你需要一种方法来匹配字符“ob”1)而不管大小写,2)不管它们之间是否有撇号。这应该很容易。

1)使用的情况下不敏感改性剂,或使用正则表达式,其指定信的资本和小写版本都是可以接受的:[Oo][Bb]

2)使用?改性剂,以指示一个字符可以是呈现一次或零次。 o'?b将匹配“o'b”和“ob”。如果您想要包含可能存在或不存在的其他字符,可以用撇号对它们进行分组。例如,o['-~]?b将匹配“ob”,“o'b”,“o-b”和“o〜b”。

所以完整的答案是[Oo]'?[Bb]

更新:OP询问一个解决方案,该解决方案将导致给定字符在任意搜索字符串中被忽略。您可以通过在搜索字符串的每个字符后插入'?来完成此操作。例如,如果您获得搜索字符串oleary,则会将其转换为o'?l'?e'?a'?r'?y'?。万无一失,但可能不是最佳的性能。请注意,如果这是一个问题,这将匹配“o'leary”,但也“o'lea'r'y”“。

+0

谢谢,请参阅我的编辑问题。我需要更通用的解决方案。 – XJones

+0

如果我正确理解更新,您希望能够在忽略撇号的同时搜索字符串。是对的吗?它会将搜索字符串分解为字符,在每个字符之间插入“?”,并将结果字符串用作正则表达式? – octern

1

在这种特殊情况下,只需将该组字符放入正则表达式的中间作为可选项即可。这特别有效,因为你的匹配字符串中只有两个字符,否则正则表达式可能会有点冗长。例如,匹配不区分大小写的反对:

o[']*b 

您可以在中间添加更多的字符,该字符类忽略它们。需要注意的是*比赛任何字符(所以O“”'奥布莱恩将匹配)的数量 - 单实例,更改为?

o[']?b 
+0

谢谢,请参阅我编辑的问题。我需要更通用的解决方案。 – XJones

+0

@XJones:你基本上只剩下Phrogz的解决方案,因为你已经改变了问题来使其他一切无效。 – Tim

+0

是的,再次,我很抱歉不清楚。我不需要这么基本的东西,但我想你无法知道这一点。谢谢你的时间。 – XJones

1

您可以将特定字符可选的一个问号,这意味着它会匹配他们是否是有或没有,例如:

/o\'?b/ 

会匹配所有上述情况,加上.+任何一方以匹配所有其它字符和空格来表示姓的开始:

/.+? o\'?b.+/ 

并使用不区分大小写的情况下使用大小写不敏感修饰符。

+0

谢谢,请参阅我的编辑。我需要更通用的解决方案。 – XJones