kotlin - 正则表达式,识别年月日

kotlin - 正则表达式,识别年月日

复制代码
<!--正则表达式日期识别,不需要处理2025.08.08的日期-->
<string name="date_regex">(?:^|(?&lt;![-\\d]))(?:(?:[2-9][0-9]{3}[-年](?:(?:0?[1-9]|1[0-2])[-月](?:0?[1-9]|[12][0-9]|3[01]))|(?:(?:0?[1-9]|1[0-2])[-月](?:0?[1-9]|[12][0-9]|3[01])))(?=(?:[日号]|$|(?![-\\d]))))[日号]?</string>

结构分解

  1. 向前边界检查 (?:^|(?<!-\\\\d))

(?:^|(?<!-\\\\d))

(?: ) - 非捕获分组

^ - 字符串开头

| - 或者

(?<!-\\\\d) - 负向前瞻,确保前面不是 - 或数字

作用:确保匹配的日期要么在字符串开头,要么前面不是 - 或数字

  1. 日期格式主体(分两部分)

第一部分:年月日格式

(?:2-90-9{3}-年(?:(?:0?1-9|10-2)-月(?:0?1-9|120-9|301))

2-90-9{3} - 年份:2000-9999

-年 - 分隔符:- 或 年

(?:0?1-9|10-2) - 月份:1-12(可选前导零)

-月 - 分隔符:- 或 月

(?:0?1-9|120-9|301) - 日期:1-31(可选前导零)

第二部分:月日格式

|(?:(?:0?1-9|10-2)-月(?:0?1-9|120-9|301))

与第一部分相同,只是没有年份部分

  1. 向后边界检查 (?=(?:日号|$|(?!-\\\\d)))

(?=(?:日号|$|(?!-\\\\d)))

(?= ) - 正向前瞻

日号 - 后面是 日 或 号

$ - 或者字符串结尾

(?!-\\\\d) - 或者后面不是 - 或数字

作用:确保日期后面是有效的边界

  1. 可选后缀 日号?

日号?

可选的 日 或 号 后缀

复制代码
package com.example.androidkotlindemo2.patternmatcher

import android.graphics.Color
import android.os.Bundle
import android.text.Spannable
import android.text.SpannableString
import android.text.style.BackgroundColorSpan
import android.text.style.ForegroundColorSpan
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import com.example.androidkotlindemo2.R
import com.example.androidkotlindemo2.utils.LogUtils
import java.util.regex.Pattern

/**
 * Author : wn
 * Email : maoning20080809@163.com
 * Date : 2025/10/12 10:34
 * Description : 正则表达式 - 识别日期,年月日
 */
class PatternMatcherMainActivity : AppCompatActivity(){

    var resultTextView : TextView? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(R.layout.pattern_matcher_main)

        resultTextView = findViewById<TextView>(R.id.pattern_matcher_result)

        test()
    }

    private fun test(){
        val regexStr = resources.getString(R.string.date_regex)
        val matcherStr = "账2025年08月08日啊,我2025年8月8日的,呢2025年8月8号咯,5.5,2015.5.5,208-08-08,啊10月10号的,2001-10-08,3001-10-08,20_2012-12-20_20,啊10月10日了,10月10日10点,05-05,5-5,2012-12-20_20_20,2025-13-20_20_20的,1-1,1-1-1,10-10-10,2025-13-11,2025-11-33,啊1000-10-10的,如果2025-12-12的,a12-12b,我们2025年12月12日干嘛2025年12月的12月12日呢"

        val pattern = Pattern.compile(regexStr)
        val matcher = pattern.matcher(matcherStr)

        val spannableString = SpannableString(matcherStr)
        while (matcher.find()){
            val start = matcher.start();
            val end = matcher.end()

            //设置背景颜色高亮
            val backgroundColorSpan = BackgroundColorSpan(Color.YELLOW)
            spannableString.setSpan(backgroundColorSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)

            //设置文字颜色
            val foregroundColorSpan = ForegroundColorSpan(Color.RED)
            spannableString.setSpan(foregroundColorSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)

            val result = matcher.group()
            LogUtils.i("匹配到:" + result)
        }

        resultTextView?.setText(spannableString)
    }
}
复制代码
pattern_matcher_main.xml布局:
复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">


    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:layout_marginTop="20dp"
        android:textSize="30sp"
        android:text="日期正则表达式\n不需要匹配2025.08.08,\n只匹配年月日,\n2025年08月08日\n2025-08-08"/>

    <TextView
        android:id="@+id/pattern_matcher_result"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="结果"/>


</LinearLayout>
复制代码
<!--正则表达式日期识别,不需要处理2025.08.08的日期-->
<string name="date_regex">(?:^|(?&lt;![-\\d]))(?:(?:[2-9][0-9]{3}[-年](?:(?:0?[1-9]|1[0-2])[-月](?:0?[1-9]|[12][0-9]|3[01]))|(?:(?:0?[1-9]|1[0-2])[-月](?:0?[1-9]|[12][0-9]|3[01])))(?=(?:[日号]|$|(?![-\\d]))))[日号]?</string>
相关推荐
洋就在江州3 分钟前
gitlab-cicd 离线集成——springboot-cicd (非docker形式,shell形式)
java·spring boot·后端·ci/cd·gitlab·gitlab-runner
Nebula_g10 分钟前
JavaSE加强:线程Thread(线程安全重点)
java·开发语言·jvm·算法·javase·技术栈
令狐少侠201114 分钟前
centos7 下,使用docker 部署IOT 调试平台,ThingsBoard 并完美启动
java·spring boot·iot
JAVA面经实录91720 分钟前
Java高级后端 · 全套面试通关手册(线上故障排查)
java·jvm·面试
IT_Octopus20 分钟前
【零基础入门 LLM 开发 · Day 11】:ChatOpenAI vs init_chat_model——一行换供应商
java·前端·javascript
Wang's Blog36 分钟前
Java 中间件之 RabbitMQ 快速入门: MQ 常见技术选型对比
java·中间件·java-rabbitmq
蜗牛互联网36 分钟前
Java Agent 工具调用的 allowlist、参数校验与调用预算
java·开发语言·人工智能·后端·oracle
大文说跨境37 分钟前
多账号环境隔离方案技术选型:指纹浏览器、VPS 与云手机的三种架构对比
java·开发语言·前端
骉马代驾1 小时前
代驾系统长连接实战(二):心跳、断线重连与消息补偿的完整实现
java
程序员Sunday1 小时前
Spring @Transactional 没回滚?按代理调用、异常和传播行为排查
java·后端·spring