【问题标题】:JavaScript regex is not working in JavaJavaScript 正则表达式在 Java 中不起作用
【发布时间】:2025-11-24 07:45:02
【问题描述】:
"^(((\+44\s?\d{4}|\(?0\d{4}\)?)\s?\d{3}\s?\d{3})|((\+44\s?\d{3}|\(?0\d{3}\)?)\s?\d{3}\s?\d{4})|((\+44\s?\d{2}|\(?0\d{2}\)?)\s?\d{4}\s?\d{4})|((\+44\s?\d{4}|\(?0\d{4}\)?)\s?\d{5})|((\+44\s?\d{5}|\(?0\d{5}\)?)\s?\d{5})|((\+44\s?\d{5}|\(?0\d{5}\)?)\s?\d{4}))(\s?\#(\d{4}|\d{3}))?$";

我使用上述模式来验证英国电话号码。它在 JavaScript(客户端)中工作。但它不适用于 Java 代码(服务器端)。 错误消息显示invalid escape sequence

【问题讨论】:

  • 我将在这里部署一个最喜欢的引语——“你认为你需要一个正则表达式来解决你的问题,所以你写一个。现在你有 2 个问题。”关键是,也许当正则表达式变得如此庞大和丑陋时,是时候考虑以另一种方式解决您的问题了。

标签: java javascript regex


【解决方案1】:

您需要将所有\ 替换为\\ 话虽如此,您的正则表达式对于电话号码来说似乎有点复杂? 我看到 GB (+44) 的国家代码被包含了很多次,所以我想你只能说一次:

^(\+44)?(...)

以及省略号所在的正则表达式的其余部分。

另一个更清楚的想法是将这个正则表达式分解成几个,例如:

if (matches case 1) return true; // example of case one
if (matches case 2) return true; // example of case two
if (matches case 3) return true; // example of case tree
...
return false;

在我看来,这段代码维护起来会简单得多。

【讨论】:

    【解决方案2】:

    这是因为 Java 根本不接受字符串中的 \(因为 \ 未转义)。转义 \ 改为 \\

    【讨论】: