Kotlin中的正则表达式指南

在本指南中,我们将讨论RegEx以及它在Kotlin中的使用方法。RegEx是 "正则表达式 "的缩写。通俗地讲,它检查一个字符串是否与某个模式相匹配。正则表达式在验证输入的情况下非常有用。

为什么这是个大问题?RegEx可以一次性处理这些验证,而不是有许多IF和ELSE运算符。

这就把我们带到了本指南的目的。在这篇文章中,我们将指导你如何在Kotlin中使用正则表达式作为验证手段,建立一个简单的应用程序来验证一个手机号码。

前提条件

我建议本指南的读者具备以下条件。

  1. Kotlin语法的基本知识
  2. 他们的设备上有一个Kotlin编译器,可以在终端运行Kotlin代码

(注意:你还需要在你的操作系统上启动并运行你的android studio)

使用RegEx检查输入模式

正则表达式模式在工作中经常会出现混乱,因此我们将学习如何使用RegEx检查字符串中的模式。下面是Kotlin中的一些RegEx模式。

为了用RegEx检查输入模式,创建一个RegEx类,变量名称为 "pattern",这个变量将包含我们想要匹配的模式。

同样地,我们将创建另一个名为 "result "的变量来指定RegEx字符串。下面是这个解释的实现。

fun main ()
{
 var pattern = Regex("wa");
 var result = pattern.containsMatchIn("Muyiwa");
 println(result);
}

输出结果为真,因为 "wa "在REGX字符串 "Muyiwa "中。

(注意:这是区分大小写的,所以,"WA "与 "wa "是不同的,但我们可以用IGNORE_CASE 忽略这种情况 )

RegexOption (IGNORE_CASE)

本节将向你展示如何在一个字符串中检查模式,而不考虑其大小写敏感性。要做到这一点,我们将把RegexOption.IGNORE_CASE 作为参数传给RegEx构造函数。因此,代码将如下所示。

fun main ()
{
 var pattern = "WA".toRegex(RegexOption.IGNORE_CASE)
 var result = pattern.containsMatchIn("Muyiwa");
 println(result);
}

两者之间有类似的过程(上面的模式),唯一的区别是如果有一个模式,上面的代码将识别它,不管它的大小写。

手机号码验证

这个项目将告诉你如何使用RegEx来验证一个手机号码。为了使流程简单,我们将把流程一步步地进行。因此,要想开始,请按照以下步骤进行相应操作。

首先,启动你的android studio并选择 "新项目"。

之后,选择 "Empty Activity "作为你的项目模板,并点击 "Next"。

在这个页面上,使用你选择的任何名字--对于这个项目,我把它叫做 "PhoneNumberValidation"。选择你选择的语言(Kotlin)并点击 "完成"。

让我们简单介绍一下我们要做的事情--我们要创建一个简单的按钮和 "编辑文本 "区域。在这个过程中,我们希望一旦用户输入一个有效的电话号码,按钮就能启用,如果是一个无效的电话号码,显示的信息应该是 "无效的电话号码"。

现在,我们可以开始设计了。

首先,在你的新项目中,点击 activity_main.xml 并在设计部分选择 "显示系统用户界面"。点击眼睛图标,找到这个。

接下来,点击 "Split",删除默认的文本视图,因为我们不希望它在那个位置。点击调色板,然后选择 "文本",将手机文本拖放到系统用户界面中(点击魔杖图标,将约束添加到EditText中)。

给EditText添加一个提示,文本为 "输入电话号码"。为了更直接的原因,我们将把ID改为编辑。因此,我们的EditText监听器将看起来像这样。

(注意:如果你想改变EditText的默认ID,这取决于你。)

接下来,我们将需要一个按钮。要做到这一点,我们将遵循与我们添加文本区相似的过程,不同的是我们要添加一个按钮。在这种情况下,我们需要这个按钮是禁用的;因此,我们将启用的属性设置为 "false"。

android:enabled="false"

因此,按钮的代码将如下所示。

<Button
 android:id="@+id/button2"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_marginTop="6dp"
 android:text="Button"
 android:enabled="false"
 app:layout_constraintEnd_toEndOf="parent"
 app:layout_constraintStart_toStartOf="parent"
 app:layout_constraintTop_toBottomOf="@+id/edit" />

将Kotlin与XML绑定

在继续进行之前,我们需要将我们的Android视图与Kotlin绑定。在过去,使用Kotlin语法执行这一操作是相当容易的。

你所要做的就是在build.gradle(:app)中添加以下插件,并通过Kotlin文件中的ID调用视图。

id 'kotlin-android'
id 'kotlin-android-extensions'

但是,这已经被废弃了,新的Android Studio项目中默认不包含这个。

Kotlin语法的问题是,即使我们可以通过他们的ID来调用这些视图,所有这些都有可能是空的;这意味着我们可以访问不属于布局的视图。

另一方面,视图绑定打破了这种差距,因为它确保在活动或片段中访问的视图不是空的。因此,空指针异常是不可能发生的。

(注意:数据绑定是视图绑定的一个替代方案,但视图绑定恰好更简单,而且视图绑定只会绑定你的视图)

下面是一个如何在你的视图上使用视图绑定的分步方法。

首先,前往你的build.gradle(:app),因为你必须明确地启用你想在项目中使用视图绑定。

在Android块中,将下面的新块添加到其中,并同步你的Gradle文件。

buildFeatures {
 viewBinding true
}

前往MainActivity.kt文件。在那里,我们要引用EditText。

视图绑定会生成一个用于访问我们的视图的绑定类。binding 因此,我们将创建一个private lateinit var ,类型为ActivityMainBinding(这是视图绑定为我们生成的类)。

基本上,对于我们项目中的每一个XML文件,视图绑定都会这样做,而且我们不需要重建我们的项目,因为不需要注释处理。

现在我们有了绑定,为了初始化它,我们将使用下面的代码。

binding = ActivityMainBinding.inflate(

*layoutInflater*基本上是将视图从一个组添加到另一个组。最后,我们将使用下面的代码将内容视图设置为binding.root。

setContentView(binding.root)

现在要访问视图,使用代码binding.id (视图的ID)。现在我们就可以开始了。

我们希望一旦用户输入了有效的手机号码,这个按钮就会被启用。要做到这一点,前往MainActivity.kt文件。我们将需要为所按下的键编写代码。下面是整个过程所需的Kotlin代码。

package com.example.phonenumbervalidation
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.text.Editable
import android.text.TextWatcher
import com.example.phonenumbervalidation.databinding.ActivityMainBinding
import java.util.regex.Pattern
class MainActivity : AppCompatActivity() {
 private lateinit var binding: ActivityMainBinding
 override fun onCreate(savedInstanceState: Bundle?) {
 super.onCreate(savedInstanceState)
 binding = ActivityMainBinding.inflate(layoutInflater)
 setContentView(binding.root)
// beginning
 binding.edit.addTextChangedListener(object:TextWatcher{
 override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
 }
 override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
 if (mobileValidate(binding.edit.text.toString()))
 binding.button2.isEnabled=true
 else{
 binding.button2.isEnabled=false
 binding.edit.setError("Invalid Phone number")
 }
 }
 override fun afterTextChanged(p0: Editable?) {
 }
 })
 }
 private fun mobileValidate(text: String?): Boolean {
 val p = Pattern.compile("\[0\][7-9]\[0-1\][0-9]{8}")
 val m = p.matcher(text)
 return m.matches()
 }
}

解释代码片断

TextWatcher 使用EditText的三个回调方法中的任何一个来监控对它所做的改变。

  • beforeTextChanged
  • onTextChanged
  • afterTextChanged

如果你想了解这些方法,这里有一个资源的链接。在onTextChanged ,我们创建了一个if语句来检查mobileValidate函数,参数为binding.edit.text.toString()。

最初,这样做会产生一个错误,因为我们没有一个名为mobileValidate的函数,所以按Alt+Enter键,在MainActivity中自动创建一个函数。将参数从Editable 改为String ,因为你希望输入的是一个字符串。

在mobileValidate函数中,我们希望我们的文本与某种模式相匹配:一个标准的尼日利亚电话号码(通常是070、080、081、090、091,共11位数字)。

因此,我们为四个不同的区间编制了一个模式,前三个区间只有一个组合,并将最后一个区间分成8个0-9区间的组合。因此,基本上,每个区间之外的任何数字都将标记为无效数字,而按钮将保持禁用。

接下来,我们将使用p.matcher()函数声明我们的匹配器实例。然后,我们将在我们的匹配器函数中解析输入,并返回m.matches()。如果我们的输入与模式相匹配,并且按钮被启用,那么结果将返回true;如果没有匹配,则返回false。

回到if语句中,如果按钮的条件仍然为真,那么按钮就应该被启用。我们也有一个else语句,以防条件变为false。我们设置了一个错误信息,抛出 "号码无效 "的通知。

在这之后,你可以在你想要的模拟器中运行该应用程序来测试它。

总结

RegEx的多功能性使它成为众多编程语言中的一个基本工具,它检查模式的能力使它成为一个有效的验证工具。

它在通用性方面的优势也伴随着多种缺点:比如它复杂的语法,这使得RegEx对老资格的程序员来说也有些困难。

尽管如此,掌握ReGex的知识是绝对有利的,因为有一天,只要你在开发领域,它就会派上用场。

The postA guide to regular expressions in Kotlinappeared first onLogRocket Blog.

作者:前端小工

%s 个评论

要回复文章请先登录注册