【发布时间】:2023-01-16 23:28:30
【问题描述】:
我正在尝试使用以下 regex 表达式从文件中读取一行:
^([A-z.]+?\\s?[A-z]+)\\s([A-z]+)\\s(\\d{7})\\s(\\d?\\d.\\d)$
在线上:
W.W.斯内德 0000574 10.0
(要清楚:目的是使任何带有字符 [a-z]、[A-Z] 或点的单词与 [A-z.]+ 部分匹配。)
但是,正则表达式无法识别 W.W. 中的第二个点,这对我来说似乎很奇怪。方括号与 + 组合是否意味着接受其中的任何字符,直到(此处)遇到空格?我找到了一个确实有效但不是那么优雅的正则表达式:
^([A-z.]+[.\\s?[A-z]+)\\s([A-z]+)\\s(\\d{7})\\s(\\d?\\d.\\d)$
我希望找到一个优雅的解决方案。很高兴听到您的意见。
不幸的是,RegEx - Not parsing dot(.) at the end of a sentence 之类的链接似乎没有回答我的问题。
【问题讨论】:
-
第二个(非可选)字符组 (
[]) 中不允许有.吗? It works 如果我只是添加缺少的点。 -
你想从输入中得到什么?输入的不同字段是什么?你为什么决定尝试用正则表达式解析它?您还尝试过哪些其他解析输入的方法?我忍不住认为解析整行的正则表达式太复杂和矫枉过正,而且将无法维护。
-
它没有意义,因为它应该检测名称。可以写下他们的首字母,给出一个输入词 (W.W.),或者写出它们,给出一个或多个:Wesley (William)。虽然考虑到正则表达式的意图有点违反直觉,但在第二个字符组中添加一个点确实有效,所以谢谢你。
-
@Someprogrammerdude 输入仅包含如上所示的行。我正在使用正则表达式来提取不同的部分并将它们相应地存储在一个类对象中,然后我可以用它来对它们进行排序,例如,等级,这是最后一个数字。使用正则表达式是否有点矫枉过正?我知道正则表达式效率不高,但真的想不出更好的方法……谢谢!
-
就像在本站点的问题中几乎每次使用正则表达式一样,在没有正则表达式的情况下解析输入几乎肯定比使用(只写)正则表达式更简单且更易于维护。