带有连字符,数字或其他真实世界标志的unicode单词的正则表达式

时间:2014-11-11 20:59:23

标签: regex string unicode

我已经尝试了一堆用于解析单词的正则表达式代码,即使我可以创建一个正确解析它们的代码,我发现很难将它转换为正则表达式。我对我的代码不满意,因为它依赖于很多'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 )和数字中的逗号以及其他问题。

一些规则:

  • Unicode caracters(例如'lúdico');
  • 删除'或'或 - 在单词的开头或结尾;
  • 保持'或 - 或$或。或者,在单词或数字的中间(例如J.A.Adams,mapa-múndi,encontra-se,0,62,zenny's,R $ 452,10。
  • 删除(或忽略)其他破折号,括号,逗号,标点符号(?或!)。

1 个答案:

答案 0 :(得分:0)

代替更好的东西,你可能想尝试(按照你的例子):

  1. 获取实际短语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).
  2. RegEx搜索((?<=^| )[- '",(.!?]+)|([-'",).!?]+(?= |$))并替换为空。
    • 使用((?<=^| )[- '",(.!?]+)|([-'",)!?]+(?= ))|([-'",).!?]+(?=$))代替,如果您需要保留空白之前的点,例如J. R. Ewing或尾随e.g.i.e.这当然不会继续工作,当字符串短语开头时,可能会持有多个以句号结尾的句子(除了最后一个句子之外的所有句子都不会被删除)。
    • 任何一个应用两个/三个子模式,其中第一个((?<=^| )[- '",(.!?]+)组合了“字符串开头”的后视或带有字符类(?<=^| )的空白[- '",(.!?],应该至少匹配一次+。另一个(s)类似地做 - 但是有一个前瞻性的。
  3. RegEx搜索((?<=^| )[^ ]+?(?= |$))并替换为"\1",
    • 同样积极的观察背后是非贪婪的“除了空白的任何东西”[^ ]+?以及空白或“行尾”(?= |$))的前瞻。
    • 要使用通用解决方案返回(例如J.R. Ewing作为令牌而不是e.g. Ewing,只要前空白组是(全部)小写(或者跟随),就可能有机会返回一些其他规则,可以用正则表达式表示)。首先,我只是将要保持在一起的那些添加到搜索表达式的开头,如((J.R. Ewing)|(J. ?A. Adams)|((?<=^| )[-\w0-9'$.,%]+?(?= |$))),即括号()之间的每个标记,后跟管道符。 J. ?A. Adams中的问号有助于同时抓住J.A. AdamsJ.A. Adams。 (将这些标记放在搜索字符串的末尾会使它们无法用于预期目的。)
    • 后者的候选人可能会在设置过程中使用(([A-Z]\. ?)+ [A-Z][a-z]+)对整个语料库进行检索。 (需要这样做,以便能够一次性将它添加到正则表达式而不是单独地添加到每一行。)
  4. 删掉尾随的逗号。
  5. 围绕结果String words[] = new String[]{};
  6. 使用TextWrangler 4.5.11测试,它自动处理Unicode。因此无法测试

    • RegEx搜索((?<=^| )[-\p{L}\p{N}'$.,%]+?(?= |$))并替换为"\1",
    • 我最接近的是搜索((?<=^| )[-\w0-9'$.,%]+?(?= |$))

    (两者都包括%,这似乎在拼写要求中缺失。)

    (请记住,为了将连字符与字符类匹配,连字符需要在类[-ab89]中首先出现 - 否则它将表示紧邻它的字符之间的范围。)