为电话号码捕获编写更多功能的RegEx

时间:2018-03-26 00:16:57

标签: regex kotlin

我正在尝试使用Kotlin和JSoup从网上检索电话号码。但是我在使RegEx正确方面遇到了一些麻烦。到目前为止,我最有效的尝试是:

val pattern = Pattern.compile("\\+[0-9.()-]{7,15}")

        val numbers = doc.getElementsMatchingOwnText(pattern)
                        .flatMap {
                            pattern.toRegex()
                                    .find(it.toString())
                                    ?.groups
                                    ?.map {
                                it!!.value
                            }!!.asIterable()
                        }

这可以获得与+1 - ### - ### - ####格式匹配的捕获数字,但无法捕获:

+1 (###) ###-#### 
+1 (###)###-####
(###)###-####

和其他北美电话号码格式。我也试过这种模式:

((\(\d{3}\) ?)|(\d{3}-))?\d{3}-\d{4}

和我在网上找到的正则表达式库中的其他几个人但他们没有工作。该网站称它使用Javascript引擎。可能这就是为什么他们不工作?

我很感激任何帮助找到一种模式来捕捉尽可能多的北美电话号码格式或寻找资源来帮助我更好地学习写我自己的。谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

每当您在线使用正则表达式时,您必须验证如何转义您正在使用的语言中的字符。

大多数在线正则表达不提供对Java / Kotlin的导出,因此它不会按原样运行。在Kotlin / Java中,您需要使用双反斜杠(\\)来正确转义字符。

有了这个解释,这是一个正在运行的正则表达式,它将匹配你给出的所有字符串:

(\\+\\d( )?)?([-\\( ]\\d{3}[-\\) ])( )?\\d{3}-\\d{4}

测试代码:

fun main(args: Array<String>) {
    var regstr = "(\\+\\d( )?)?([-\\( ]\\d{3}[-\\) ])( )?\\d{3}-\\d{4}"
    var teststr1 = "+1-555-555-5555"   // +1-###-###-####
    var teststr2 = "+1 (555) 555-5555" // +1 (###) ###-####
    var teststr3 = "+1 (555)555-5555"  // +1 (###)###-####
    var teststr4 = "(555)555-5555"     // (###)###-####
    var teststr5 = "(55)5555-555"      // Not valid format
    println("matched: " + regstr.toRegex().find(teststr1)?.value)
    println("matched: " + regstr.toRegex().find(teststr2)?.value)
    println("matched: " + regstr.toRegex().find(teststr3)?.value)
    println("matched: " + regstr.toRegex().find(teststr4)?.value)
    println("matched: " + regstr.toRegex().find(teststr5)?.value)
}

旁注:很可能,有一个更好的正则表达式 - 只是使这个正则表达式匹配你提供的所有字符串。

答案 1 :(得分:0)

我刚刚开始,但当你提到长度时,你没有包括空格字符。此外,您还需要使用\来转义诸如+()和 - 这些在RegEx中具有特殊含义的字符。

阿德里亚诺对他的配对非常具体。根据准确性的重要程度,你也可以尝试一个我提出的更简单的版本,与你的类似,但包括我上面提到的案例。

[\\+0-9\\(\\)\\- ]{7,19}

希望上面说得对。阿德里亚诺说,你需要确保你有正确的逃脱角色。通常是单个\或双\\