- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试匹配用户输入中的粗鲁词语,例如“我恨你!”或“i.håté.Yoù”将与从 JSON 解析的单词数组中的“恨你”相匹配。
所以我需要它不区分大小写和变音符号,并将粗鲁单词中的空格视为任何非字母字符:正则表达式元字符 \P{L}
应该适用于此,或者至少 \W
现在我知道 [cd]
与 NSPredicate
一起工作,就像这样:
func matches(text: String) -> [String]? {
if let rudeWords = JSON?["words"] as? [String]{
return rudeWords.filter {
let pattern = $0.stringByReplacingOccurrencesOfString(" ", withString: "\\P{L}", options: .CaseInsensitiveSearch)
return NSPredicate(format: "SELF MATCHES[cd] %@", pattern).evaluateWithObject(text)
}
} else {
log.debug("error fetching rude words")
return nil
}
}
这对任何一个元字符都不起作用,我猜它们不会被 NSpredicate
解析,所以我尝试像这样使用 NSRegularExpression
:
func matches(text: String) -> [String]? {
if let rudeWords = JSON?["words"] as? [String]{
return rudeWords.filter {
do {
let pattern = $0.stringByReplacingOccurrencesOfString(" ", withString: "\\P{L}", options: .CaseInsensitiveSearch)
let regex = try NSRegularExpression(pattern: pattern, options: .CaseInsensitive)
return regex.matchesInString(text, options: [], range: NSMakeRange(0, text.characters.count)).count > 0
}
catch _ {
log.debug("error parsing rude word regex")
return false
}
}
} else {
log.debug("error fetching rude words")
return nil
}
}
这似乎工作正常,但我不知道如何使正则表达式变音符号不敏感,所以我尝试了这个(以及其他解决方案,如重新编码)
let text = text.stringByFoldingWithOptions(.DiacriticInsensitiveSearch, locale: NSLocale.currentLocale())
但是,这对我不起作用,因为每次键入字符时我都会检查用户输入,所以我尝试去除重音的所有解决方案都使应用程序非常慢。
有人知道是否还有其他解决方案,或者我是否以错误的方式使用它?
谢谢
实际上我错了,导致应用变慢的原因是试图匹配 \P{L}
,我尝试使用 \W
和重音去除线,现在它可以正常工作,即使它匹配的字符串比我最初想要的少。
这些可能会帮助一些人处理正则表达式和谓词:
最佳答案
朝不同的方向前进可能是值得的。如果您更改正则表达式,而不是展平输入,会怎样?
不是匹配hate.you
,而是匹配[h][åæaàâä][t][ëèêeé].[y][o0][ùu]
,例如(无论如何,这都不是一个完整的列表)。即时执行此转换(而不是存储它)是最有意义的,因为如果您以后需要更改字符扩展的内容,这可能会更容易。
这将使您能够更好地控制要匹配的字符。如果你看,我有 0
作为匹配 o
的字符。没有多少 Unicode 强制可以让你做到这一点。
关于regex - 正则表达式与 Swift 中元字符的大小写和变音符号不敏感匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35017404/
我是 java 正则表达式的新手。我在 Docs 中看到了这个: $ The end of a line 但是当我尝试这个片段时: String str = "firstline\r\nsecondl
我需要在 apache (httpd) 中设置 500 个不同的虚拟主机,并且配置相同。我认为可以使用元字符或循环,而不是复制相同的 500 次......我尝试搜索一些信息,但找不到任何解决方法。有
我正在使用 os.walk(directory) 递归地显示该目录中的所有文件。问题是我只需要显示名称中包含询问字符串的文件,而且它还必须管理元字符。 我现在拥有的是: for root, subdi
下表包含了元字符的完整列表以及它们在正则表达式上下文中的行为: 字符 描述 \ 将下一个字符标记为一个特殊字
在练习中,我编写了一个由最多匹配 3 个大写字符的元字符组成的表达式。 例子 a -> match A -> match Ab -> match AbC -> match AbCd -> match
我正在学习 Java OCP 证书。我正在参加模拟考试来准备。 示例程序: public class Quetico { public static void main(String[] ar
Haskell PCRE 库是否提供了转义字符串中正则表达式元字符的函数? IE。一个函数,用于将“[$100]”这样的字符串转换为“\[\$100\]”。 我正在寻找Python的re.escape
我研究过,我知道 '?'如果结果在匹配函数中出现 0 次或 1 次,则用于匹配。不幸的是,我找不到一个明确的例子来说明“?”到底是什么?匹配。 干杯。 最佳答案 正则表达式 co?at 将匹配 coa
我正在尝试转义 Java 中的 RegExp 元字符。以下是我想要的: INPUT STRING: "This is $ test" OUTPUT STRING: "This is \$ test"
什么是正则表达式呢? 正则表达式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),它是计算机科学的一个概念。正则表达式使用单
说到shell通配符(wildcard),大家在使用时候会经常用到。 下面是一个实例: [chengmo@localhost ~/shell]$ ls a.txt b.txt c.old
我现在很困惑。 期待 documentation陈述如下: Remember that Pexpect does NOT interpret shell meta characters such as
\D元字符可以匹配非数字字符,等价于"[^0-9]"。 语法结构: (1).构造函数方式: new RegExp("\\D") (2).对象直接量方式
我是一名优秀的程序员,十分优秀!