Java 用于CSV货币的正则表达式
Hi有一个包含多个值的csv文件。它包含的一个内容是货币栏。该文件的一个示例是:Java 用于CSV货币的正则表达式,java,regex,Java,Regex,Hi有一个包含多个值的csv文件。它包含的一个内容是货币栏。该文件的一个示例是: ...,...,...,$100,...,... ...,...,...,$2,500,...,... 我见过正则表达式从每一行中提取货币值。然而,我的问题来了,因为它是一个csv文件,在货币价值中有一个逗号 我的解决方案是对文件进行预处理,查找带有逗号的货币值,然后简单地删除它们。然而,我很难编写一个正则表达式来实现这一点 有人能帮忙吗?只要货币字段后面没有整数字段, 您可以提取货币价值,然后使用回调替换 逗号
...,...,...,$100,...,...
...,...,...,$2,500,...,...
我见过正则表达式从每一行中提取货币值。然而,我的问题来了,因为它是一个csv文件,在货币价值中有一个逗号
我的解决方案是对文件进行预处理,查找带有逗号的货币值,然后简单地删除它们。然而,我很难编写一个正则表达式来实现这一点
有人能帮忙吗?只要货币字段后面没有整数字段,您可以提取货币价值,然后使用回调替换
逗号的 这只匹配错误逗号的money字段
# "\\$(?:\\d+(?:,\\d{3})+(?:\\.\\d*)?)"
\$
(?:
\d+
(?:
,
\d{3}
)+
(?: \. \d* )?
)
# "\\$(?:\\d+(?:,\\d{3})*(?:\\.\\d*)?|\\.\\d+)"
\$
(?:
\d+
(?:
,
\d{3}
)*
(?: \. \d* )?
| \. \d+
)
这与错误或不正确的货币字段相匹配
# "\\$(?:\\d+(?:,\\d{3})+(?:\\.\\d*)?)"
\$
(?:
\d+
(?:
,
\d{3}
)+
(?: \. \d* )?
)
# "\\$(?:\\d+(?:,\\d{3})*(?:\\.\\d*)?|\\.\\d+)"
\$
(?:
\d+
(?:
,
\d{3}
)*
(?: \. \d* )?
| \. \d+
)
只要money字段后面没有整数字段,您可以提取货币价值,然后使用回调替换
逗号的 这只匹配错误逗号的money字段
# "\\$(?:\\d+(?:,\\d{3})+(?:\\.\\d*)?)"
\$
(?:
\d+
(?:
,
\d{3}
)+
(?: \. \d* )?
)
# "\\$(?:\\d+(?:,\\d{3})*(?:\\.\\d*)?|\\.\\d+)"
\$
(?:
\d+
(?:
,
\d{3}
)*
(?: \. \d* )?
| \. \d+
)
这与错误或不正确的货币字段相匹配
# "\\$(?:\\d+(?:,\\d{3})+(?:\\.\\d*)?)"
\$
(?:
\d+
(?:
,
\d{3}
)+
(?: \. \d* )?
)
# "\\$(?:\\d+(?:,\\d{3})*(?:\\.\\d*)?|\\.\\d+)"
\$
(?:
\d+
(?:
,
\d{3}
)*
(?: \. \d* )?
| \. \d+
)
如果所有其他字段都是非数字字段,则可以读取整个文件,只匹配数字之间的逗号,然后替换/删除它们。您可以像以下那样使用正则表达式:
(?<=\d)(,)(?=\d)
(?如果所有其他字段都是非数字字段,您可以读取整个文件,只匹配数字之间的逗号,并替换/删除它们。您可以使用regex,如:
(?<=\d)(,)(?=\d)
(?我在Python中测试了这一点,但在Java中也应该是一样的:
r"\$(\d{1,3}(?:,\d{3})*)"
我认为您可能需要加倍使用Java的转义字符。请细分:
\$\匹配美元符号
(#启动组
\d{1,3}#匹配第一组(或唯一一组)1-3位数字,
(?:#启动内部组,我们不会单独捕获它
,#匹配逗号
\d{3}#后跟三位数字
)*#内部组的0个或更多
)#结束语
我在字符串“…$1000123,…$1”上测试了它,它返回了匹配的组['1000123','1']
。我希望这能有所帮助
编辑:
在Java中,似乎可以用双反斜杠“\\”
替换上面的单反斜杠字符
另外,如注释所述,删除字符串前面的r
,以便在Java中使用,因此在Java中正则表达式是:
pattern = "\\$(\\d{1,3}(?:,\\d{3})*)"
我在Python中对此进行了测试,但在Java中也应该如此:
r"\$(\d{1,3}(?:,\d{3})*)"
我认为您可能需要加倍使用Java的转义字符。请细分:
\$\匹配美元符号
(#启动组
\d{1,3}#匹配第一组(或唯一一组)1-3位数字,
(?:#启动内部组,我们不会单独捕获它
,#匹配逗号
\d{3}#后跟三位数字
)*#内部组的0个或更多
)#结束语
我在字符串“…$1000123,…$1”上测试了它,它返回了匹配的组['1000123','1']
。我希望这能有所帮助
编辑:
在Java中,似乎可以用双反斜杠“\\”
替换上面的单反斜杠字符
另外,如注释所述,删除字符串前面的r
,以便在Java中使用,因此在Java中正则表达式是:
pattern = "\\$(\\d{1,3}(?:,\\d{3})*)"
货币的正则表达式?现行汇率是多少?这是无效的CSV。CSV中的$2500
是两个独立的字段,一个包含$2
,另一个包含5000
。在你尝试解析CSV之前,你应该修复任何构建此CSV的内容。如果离开Marc B的注释,我会将delimeter从逗号切换到y你知道不会在你的任何领域(像管道一样)或者不要用逗号写你的美元金额。你最好使用;
分隔符。如上所述-文件是无效的CSV,但如果其他字段是非数字的,那就另当别论了。货币的正则表达式?现行汇率是多少?这是无效的CSV。CSV中的$2500
是两个单独的字段,一个包含$2
,另一个包含一个其他包含5000
。您应该在尝试解析它之前修复构建此csv的任何内容。根据Marc B的评论,我会将delimeter从逗号切换到您知道不在任何字段中的内容(如管道|)或者不要用逗号写你的美元金额。你最好使用;
分隔符。如上所述-文件是无效的CSV,但如果其他字段是非数字的,那就另当别论了。这是正确的(同时删除字符串前面的r)。+1这是正确的(同时删除字符串前面的r)。+1