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

<!--正则表达式日期识别,不需要处理2025.08.08的日期-->
<string name="date_regex">(?:^|(?<![-\\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>
结构分解
- 向前边界检查 (?:^|(?<![-\\d]))
(?:^|(?<![-\\d]))
(?: ) - 非捕获分组
^ - 字符串开头
| - 或者
(?<![-\\d]) - 负向前瞻,确保前面不是 - 或数字
作用:确保匹配的日期要么在字符串开头,要么前面不是 - 或数字
- 日期格式主体(分两部分)
第一部分:年月日格式
(?:[2-9][0-9]{3}[-年](?:(?:0?[1-9]|1[0-2])[-月](?:0?[1-9]|[12][0-9]|3[01]))
2-9\]\[0-9\]{3} - 年份:2000-9999
\[-年\] - 分隔符:- 或 年
(?:0?\[1-9\]\|1\[0-2\]) - 月份:1-12(可选前导零)
\[-月\] - 分隔符:- 或 月
(?:0?\[1-9\]\|\[12\]\[0-9\]\|3\[01\]) - 日期:1-31(可选前导零)
第二部分:月日格式
\|(?:(?:0?\[1-9\]\|1\[0-2\])\[-月\](?:0?\[1-9\]\|\[12\]\[0-9\]\|3\[01\]))
与第一部分相同,只是没有年份部分
3. 向后边界检查 (?=(?:\[日号\]\|$\|(?!\[-\\\\d\])))
(?=(?:\[日号\]\|$\|(?!\[-\\\\d\])))
(?= ) - 正向前瞻
\[日号\] - 后面是 日 或 号
$ - 或者字符串结尾
(?!\[-\\\\d\]) - 或者后面不是 - 或数字
作用:确保日期后面是有效的边界
4. 可选后缀 \[日号\]?
\[日号\]?
可选的 日 或 号 后缀
```
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