gpt4 book ai didi

java - 使用正则表达式,java从电话号码中删除可选的零

转载 作者:行者123 更新时间:2023-12-02 02:20:05 24 4
gpt4 key购买 nike

我有一个 java 类(称为 PhoneNumber)来验证和处理电话号码。

我自己编写了最后一个方法(删除可选的零),但我希望它更简单一些(可能使用正则表达式来识别可选的零并使用相同的正则表达式删除它,就像OPTIONAL_PHONE_NUMBER_CHARACTERS部分)。这段代码感觉很脆弱,而且不是 100% 正确,尽管我认为它满足了我的需要并涵盖了我能想到的所有单元测试。

任何人都可以给我一个包含正确正则表达式的清晰示例吗? (也欢迎其他简单的解决方案)。

private static final Pattern VALID_PHONE_NUMBER_REGEX = Pattern.compile("\\+?[0-9#*]{1,20}");
private static final Pattern OPTIONAL_PHONE_NUMBER_CHARACTERS = Pattern.compile("[\\s()/.-]");

public static boolean isValid(String phoneNumber)
{
if (phoneNumber == null || phoneNumber.isEmpty())
{
return false;
}

String compactPhoneNumber = removeOptionalCharacters(phoneNumber);
return VALID_PHONE_NUMBER_REGEX.matcher(compactPhoneNumber).matches();
}

public static String removeOptionalCharacters(String phoneNumber)
{
String phoneNumberWithoutOptionalZero = removeOptionalZero(phoneNumber);
return OPTIONAL_PHONE_NUMBER_CHARACTERS.matcher(phoneNumberWithoutOptionalZero).replaceAll("");
}

private static final String OPTIONAL_ZERO = "(0)";
private static final String OPTIONAL_ZERO_SPLIT_REGEX = Pattern.quote("(0");

public static String removeOptionalZero(String phoneNumber)
{
String[] split = phoneNumber.split(OPTIONAL_ZERO_REGEX);
if (split.length == 2 && !split[0].isEmpty())
{
return phoneNumber.replaceAll(OPTIONAL_ZERO, "");
}
return phoneNumber;
}

如您所见,我已经提取了用于删除可选字符的代码,以防我需要使用电话号码调用电话。例如。 +31 12-3456-789 将变成 +31123456789

我想使用方法 removeOptionalCharacters 进行的转换如下:

+31 (0)12 3456 789   >   +31123456789
+31 (012) 3456 789 > +31123456789
(0)12 3456 789 > 0123456789
(012) 3456 789 > 0123456789

总而言之,这些是应该成功的单元测试:

@Test
public void removeOptionalCharacters_HooksAroundOptionalZero_ZeroIsRemoved()
{
String compactPhoneNumber = PhoneNumber.removeOptionalCharacters("+31 (0)12 3456789");
assertEquals("+31123456789", compactPhoneNumber);
}

@Test
public void removeOptionalCharacters_HooksAroundAreaCode_ZeroIsRemoved()
{
String compactPhoneNumber = PhoneNumber.removeOptionalCharacters("+31 (012) 3456789");
assertEquals("+31123456789", compactPhoneNumber);
}

@Test
public void removeOptionalCharacters_HooksAroundOptionalZeroWithoutCountryCode_ZeroIsNotRemoved()
{
String compactPhoneNumber = PhoneNumber.removeOptionalCharacters("(0)12 3456789");
assertEquals("0123456789", compactPhoneNumber);
}

@Test
public void removeOptionalCharacters_HooksAroundAreaCodeWithoutCountryCode_ZeroIsNotRemoved()
{
String compactPhoneNumber = PhoneNumber.removeOptionalCharacters("(012)3456789");
assertEquals("0123456789", compactPhoneNumber);
}

ps。我认为这些测试涵盖了所有带有可选零的常见情况。当然,还有更多的单元测试来涵盖整个事情(3456789 部分还可以包含不应删除的零,其他可选字符(例如 - 和 +)也不应受到影响等),但为了简单起见,我留下了他们出去。如果您考虑一下电话号码,您就可以自己猜出其余部分。

最佳答案

我会使用两个正则表达式。一个用于验证电话号码,一个用于规范化电话号码,省略可选字符。您的规范化正则表达式应包含独占匹配组(用 | 分隔)。 (0) 的匹配组将是

(\(0\)) 

我确信有 Java API 可用于获取各个匹配组并将其替换为您喜欢的任何内容。

组合 (0) 和其他字符的正则表达式将是:

(\(0\))|([\\s()/.-])

仅将第一个匹配组的第一个匹配项替换为“”。将第二组的所有匹配项替换为“”

或者直接保留您的代码。它是自记录的可读代码。正则表达式需要文档。

关于java - 使用正则表达式,java从电话号码中删除可选的零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48627847/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com