regex - 正则表达式从Python到Kotlin

标签 regex kotlin

我有一个关于正则表达式(Regex)的问题,我真的是新手。我找到了一个用Python编写的正则表达式教程,该教程删除了数据并将其替换为空字符串。
这是来自Python的代码:

import re

def extract_identity(data, context):
    """Background Cloud Function to be triggered by Pub/Sub.
    Args:
         data (dict): The dictionary with data specific to this type of event.
         context (google.cloud.functions.Context): The Cloud Functions event
         metadata.
    """
    import base64
    import json
    import urllib.parse
    import urllib.request

    if 'data' in data:
        strjson = base64.b64decode(data['data']).decode('utf-8')
        text = json.loads(strjson)
        text = text['data']['results'][0]['description']

        lines = text.split("\n")
        res = []
        for line in lines:
            line = re.sub('gol. darah|nik|kewarganegaraan|nama|status perkawinan|berlaku hingga|alamat|agama|tempat/tgl lahir|jenis kelamin|gol darah|rt/rw|kel|desa|kecamatan', '', line, flags=re.IGNORECASE)
            line = line.replace(":","").strip()
            if line != "":
                res.append(line)

        p = {
            "province": res[0],
            "city": res[1],
            "id": res[2],
            "name": res[3],
            "birthdate": res[4],
        }

        print('Information extracted:{}'.format(p))

在上述功能中,信息的提取是通过删除所有带有正则表达式的e-KTP标签来完成的。

这是e-KTP的示例:
enter image description here

这是使用python代码扫描该e-KTP之后的结果:
Information extracted:{'province': 'PROVINSI JAWA TIMUR', 'city': 'KABUPATEN BANYUWANGI', 'id': '351024300b730004', 'name': 'TUHAN', 'birthdate': 'BANYUWANGI, 30-06-1973'}

这是上面code的完整教程。

然后我的问题是,是否可以像在python代码中那样,在Kotlin中使用Regex从e-KTP的结果中删除标签?因为我尝试了一些我理解的逻辑,但并没有删除e-KTP的标签。我在Kotlin中的代码是这样的:
....

        val lines = result.text.split("\n")
        val res = mutableListOf<String>()
        Log.e("TAG LIST STRING", lines.toString())
        for (line in lines) {
            Log.e("TAG STRING", line)
            line.matches(Regex("gol. darah|nik|kewarganegaraan|nama|status perkawinan|berlaku hingga|alamat|agama|tempat/tgl lahir|jenis kelamin|gol darah|rt/rw|kel|desa|kecamatan"))
            line.replace(":","")

            if (line != "") {
                res.add(line)
            }
            Log.e("TAG RES", res.toString())

        }
        Log.e("TAG INSERT", res.toString())
        tvProvinsi.text = res[0]
        tvKota.text = res[1]
        tvNIK.text = res[2]
        tvNama.text = res[3]
        tvTgl.text = res[4]

        ....

这是我的代码的结果:
TAG LIST STRING: [PROVINSI JAWA BARAP, KABUPATEN TASIKMALAYA, NIK 320625XXXXXXXXXX, BRiEAFAUZEROMARA, Nama, TempatTgiLahir, Jenis keiamir, etc]

TAG INSERT: [PROVINSI JAWA BARAP, KABUPATEN TASIKMALAYA, NIK 320625XXXXXXXXXX, BRiEAFAUZEROMARA, Nama, TempatTgiLahir, Jenis keiamir, etc]

标签仍然存在,是否可以使用Regex或类似Kotlin的Python中的标签删除标签?

最佳答案

重点是将 kotlin.text.replace Regex一起用作搜索参数。例如:

text = text.replace(Regex("""<REGEX_PATTERN_HERE>"""), "<REPLACEMENT_STRING_HERE>")

您可以使用
line = line.replace(Regex("""(?i)gol\. darah|nik|kewarganegaraan|nama|status perkawinan|berlaku hingga|alamat|agama|tempat/tgl lahir|jenis kelamin|gol darah|rt/rw|kel|desa|kecamatan"""), "")

请注意,模式开头的(?i)是使整个模式不区分大小写的快速方法。

另外,当您需要将.与正则表达式匹配时,需要对其进行转义。由于反斜杠可以通过多种方式编码,并且人们经常无法正确执行反斜杠,因此始终建议在原始字符串文字中定义正则表达式模式,因此在Kotlin中,您可以使用三重双引号字符串文字,即"""...""",其中每个\被视为文字反斜杠,用于形成正则表达式转义符。

关于regex - 正则表达式从Python到Kotlin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59624098/

相关文章:

android - 来自位图源的图像的 LazyColumn 闪烁/闪烁

Android - 向 MutableLiveData 添加新项目并观察

spring - 获取请求 header 名称和值

c# - 标题的正则表达式匹配

java - 设置特殊正则表达式的长度

javascript - 我用于查找多个空格的正则表达式如何不匹配换行符?

java - 项目未在项目中使用 Kotlin 进行编译

android - Kotlin DataBinding 将静态函数传递到布局 xml

regex - 多组正则表达式

java - 正则表达式:匹配 n-char 长重复字符序列