在 Java 中使用正则表达式设置字符串的格式

2022-09-03 08:27:24

有没有办法使用正则表达式将字符串格式化为特定模式,或者字符串生成器+子字符串是一种更快的方法?

例如,说一个电话号码 --> 1234567890 作为输入

并将输出作为 --> (123) 456-7890

我看到这篇文章是可能的:http://www.4guysfromrolla.com/webtech/031302-1.shtml 但给出的解释是在ASP中。如何在Java中执行此操作???


答案 1

免責聲明

由于有几个答案已经解决了字符串生成器等的更高效率,因此我想向您展示如何使用正则表达式完成它,并解决使用此方法的好处。

一个正则表达式解决方案

使用此匹配正则表达式(类似于 Alan Moore 的表达式):

(.{3})(.{3})(.{4})

允许您将 10 个字符精确匹配到 3 个组中,然后使用引用这些组的替换表达式,并添加其他字符:

($1) $2-$3

从而按照您的要求生产替代品。当然,它也将匹配标点符号和字母,这是使用(编码为Java字符串)而不是通配符的原因。\d\\d.

为什么选择正则表达式?

正则表达式方法的潜在优点是将“逻辑”压缩为字符串操作。由于所有“逻辑”都可以压缩为一串字符,而不是预编译的代码,因此正则表达式匹配和替换字符串可以存储在数据库中,以便有经验的系统用户更轻松地操作,更新或自定义。这使得情况在几个层面上更加复杂,但为用户提供了更大的灵活性。

使用其他方法(字符串操作),仅通过用户界面基本上不可能更改格式设置算法以使其生成或代替指定的格式设置算法。使用正则表达式方法,修改将非常简单,只需将(在数据库或类似存储中)更改为或根据需要进行更改即可。(555)123-4567555.123.4567(555) 123-4567($1) $2-$3$1.$2.$3($1)$2-$3

如果要修改系统以接受“更脏”的输入,其中可能包括各种格式化尝试,例如将它们重新格式化为一致的内容,则可以创建一个能够执行此操作的字符串操作算法,并重新编译应用程序以按照您希望的方式工作。但是,使用正则表达式解决方案,不需要对系统进行大修 - 只需像这样更改解析和替换表达式即可(对于初学者来说,可能有点复杂,无法立即理解):555-123.4567

^\D*1?\D*([2-9])\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d).*$
($1$2$3) $4$5$6-$7$8$9$10

这将允许对程序的功能进行重大“升级”,如以下重新格式化所示:

"Input"                       "Output"
----------------------------- --------------------------------
"1323-456-7890 540"           "(323) 456-7890"
"8648217634"                  "(864) 821-7634"
"453453453322"                "(453) 453-4533"
"@404-327-4532"               "(404) 327-4532"
"172830923423456"             "(728) 309-2342"
"jh345gjk26k65g3245"          "(345) 266-5324"
"jh3g24235h2g3j5h3"           "(324) 235-2353"
"12345678925x14"              "(234) 567-8925"
"+1 (322)485-9321"            "(322) 485-9321"
"804.555.1234"                "(804) 555-1234"
"08648217634"                 <no match or reformatting>

如您所见,它对输入“格式化”非常“宽容”,并且知道应该在数字的开头忽略它,这应该会导致错误,因为它是无效的 - 所有这些都存储在单个字符串中。10

问题归结为性能与定制潜力。字符串操作比正则表达式更快,但将来的增强自定义需要重新编译,而不是简单地更改字符串。也就是说,有些事情不能很好地表达(甚至像上面的变化一样可读),还有一些事情是正则表达式无法实现的。

TL;DR:

正则表达式允许将解析算法存储到一个相对较短的字符串中,该字符串可以轻松存储,以便在不重新编译的情况下进行修改。更简单、更集中的字符串操作函数效率更高,有时可以完成比正则表达式更多的工作。关键是要了解工具和应用程序的要求,并使用最适合这种情况的工具。


答案 2

当无法使用相同或更难做到这一点时,人们会选择。REsubstring

在你的情况下,最好只是使用和StringBuilderinsert()

假设电话号码长度验证已到位(= 10个字符)

        String phoneNumber = "1234567890";
        StringBuilder sb = new StringBuilder(phoneNumber)
                                .insert(0,"(")
                                .insert(4,")")
                                .insert(8,"-");
        String output = sb.toString();
        System.out.println(output);          

输出

(123)456-7890