我已经尝试了一堆用于解析单词的正则表达式代码,即使我可以创建一个正确解析它们的代码,我发现很难将它转换为正则表达式。我对我的代码不满意,因为它依赖于很多'ifs'和手动替换。
这是我的测试用例:
String phrase =“O mapa-múndiencontra-se com J.A.Adams - autor 'lúdico' - e custa 0,62%zenny's,o等价R $ 452,10(ou $ 200)“;
这是我想要的输出:
String words [] = new String [] {“O”,“mapa-múndi”,“encontra-se”,“com”, “J.A.Adams”,“autor”,“lúdico”,“e”,“custa”,“0,62%”,“zenny's”,“o”, “equivalente”,“a”,“R $ 452,10”,“ou”,“$ 200”};
我已经尝试了“([^ \ p {L} \ p {N} - ''] | $ | ^)+”,但它以空字符串开头并从名称中删除点(JAAdams )和数字中的逗号以及其他问题。
一些规则:
答案 0 :(得分:0)
代替更好的东西,你可能想尝试(按照你的例子):
O mapa-múndi encontra-se com J.A.Adams -- autor 'lúdico' -- e custa 0,62% zenny's, o equivalente a R$452,10 (ou $200).
((?<=^| )[- '",(.!?]+)|([-'",).!?]+(?= |$))
并替换为空。
((?<=^| )[- '",(.!?]+)|([-'",)!?]+(?= ))|([-'",).!?]+(?=$))
代替,如果您需要保留空白之前的点,例如J. R. Ewing
或尾随e.g.
或i.e.
这当然不会继续工作,当字符串短语开头时,可能会持有多个以句号结尾的句子(除了最后一个句子之外的所有句子都不会被删除)。((?<=^| )[- '",(.!?]+)
组合了“字符串开头”的后视或带有字符类(?<=^| )
的空白[- '",(.!?]
,应该至少匹配一次+
。另一个(s)类似地做 - 但是有一个前瞻性的。((?<=^| )[^ ]+?(?= |$))
并替换为"\1",
。
[^ ]+?
以及空白或“行尾”(?= |$))
的前瞻。J.R. Ewing
作为令牌而不是e.g. Ewing
,只要前空白组是(全部)小写(或者跟随),就可能有机会返回一些其他规则,可以用正则表达式表示)。首先,我只是将要保持在一起的那些添加到搜索表达式的开头,如((J.R. Ewing)|(J. ?A. Adams)|((?<=^| )[-\w0-9'$.,%]+?(?= |$)))
,即括号()
之间的每个标记,后跟管道符。 J. ?A. Adams
中的问号有助于同时抓住J.A. Adams
和J.A. Adams
。 (将这些标记放在搜索字符串的末尾会使它们无法用于预期目的。)(([A-Z]\. ?)+ [A-Z][a-z]+)
对整个语料库进行检索。 (需要这样做,以便能够一次性将它添加到正则表达式而不是单独地添加到每一行。)String words[] = new String[]{
和};
使用TextWrangler 4.5.11测试,它自动处理Unicode。因此无法测试
((?<=^| )[-\p{L}\p{N}'$.,%]+?(?= |$))
并替换为"\1",
。((?<=^| )[-\w0-9'$.,%]+?(?= |$))
。(两者都包括%
,这似乎在拼写要求中缺失。)
(请记住,为了将连字符与字符类匹配,连字符需要在类[-ab89]
中首先出现 - 否则它将表示紧邻它的字符之间的范围。)