2021-04-25

高级的字符串处理——正则表达式(一)

这一章是讲了一个快速判断用户是不是输入正确格式字符串的方法,如果你会了可以不看。(调用public boolean matches(String regex)方法)

引例:
一天你的女朋友突然问你:亲爱的~~在我之前你交了几个女朋友啊?
可是你并不像确切的告诉她,于是你说了有”\dgirlfriend”
女友说什么意思?你有过几个女朋友,三个?四个?
为了防止她猜出,你面无表情的说都对。
在这里\d是一个有特殊意义的元字符,代表0~9中任何一个,”0girlfriend””1girlfriend””2girlfriend”…”9girlfriend”都是和正则表达式”\dgirlfriend”匹配的字符序列。
所以只要女友说的是10以内的自然数,都是对的。

一、常用正则表达式写法及其意义
. 代表任何一个字符
\d代表0~9中任意一个数
\D代表任意非数字字符
\s代表空格类字符’\t’’\n’’\x0B’’\f’’\r’
\S代表非空格类字符
\w代表可用于标识符的字符(不包括$)
\W代表不能用于标识符的字符
\p{Lower}代表小写字母[a-z]
\P{Upper}代表大写字母[A-Z]
\p{ASCII}ASCII字符(一种编码)
\p{Alpha}字母
\p{Digit}数字字符[0-9]
\p{Alnum}数字或字母
\p{Punct}标点符号!“#¥%&’()**+,-./<=>?@[]^_`{|}~
\p{Graph}可视字符\p{Alnum}\p{Punct}
\p{Print}可打印字符\p{Print}
\{Blank}空格或制表符[\t]
\p{Cntrl}控制字符[\x00-\x1F\x7F]
这些是加一个\就是正则表达式的写法(.除外)
注:由于“.”代表任何一个字符,所以在正则表达式中如果想使用普通意义的点字符,必须使用[.]或\56表示普通意义的点字符

二、表示元字符

在正则表达式中可以用方括号括起若干个字符串来表示一个元字符

String regex =[139]girlfriend“

”1girlfriend””3girlfriend””9girlfriend”都是和正则表达式regex匹配的序列。

基础:
[abc]:代表a,b,c中任何一个
[^abc}:代表除了a,b,c以外的任何字符
[a-zA-Z]:代表英文字母中的任何一个
[a-d]:代表a~d中任何一个

进阶:
中括号里允许嵌套中括号,可以进行并 交 差运算
[a-d[m-p]]:代表ad或mp中的任何字符(并)
[a-z&&[def]]:代表d e f中任何一个(交)
[a-f&&[^bc]]:代表a d e f(差)

三、限定修饰符

X? X出现0或1次
X* X出现0或多次
X+ X出现1或多次
X{n} X恰好出现n次
X{n,} X至少出现n次
X{n,m} X出现n次至m次
XY X的后缀是Y
X|Y X或Y

String regex = “girl[246]?;

“girl”“girl2”“girl4”“girl6”都是与正则表达式regex匹配的字符串

String regex  = “@\\w{4};

“@abcd””@南瓜仔仔””@Java”都是匹配的字符串

四、案例

用户在输入用户名,我们要判断用户名是否由英文字母、数字或下划线组成

import java.util.Scanner;
public class Example {
    public static void main(String[] args) {
        String regex = "[a-zA-Z|0-9|_]+";
        Scanner scanner = new Scanner(System.in);
        String str = scanner.nextLine();
        if(str.matches(regex)){
            System.out.println(str + "是否由英文字母、数字或下划线组成");
        }else {
            System.out.println(str + "中有非法字符");
        }
    }
}
要比较两个时间戳之间的差异,可以利用 `date` 命令或者编程语言(如 Python 或 Bash 脚本)来实现。以下是具体方法: ### 方法一:通过 Linux 的 `date` 和 `awk` 计算时间差 可以通过以下命令计算两个时间戳之间的时间差(单位为秒)。 ```bash #!/bin/bash timestamp1="2025-03-16T13:33:38+08:00" timestamp2="2021-04-22T08:25:10Z" # 将时间转换为 UTC 时间并获取 Unix 时间戳 time1=$(date -u -d "${timestamp1}" +%s) time2=$(date -u -d "${timestamp2}" +%s) # 计算时间差 diff=$((time1-time2)) echo "Time difference in seconds: $diff" ``` 上述脚本会将输入的时间戳转换为 Unix 时间戳,并计算两者之差[^1]。 --- ### 方法二:使用 Python 编写脚本来比较时间戳 Python 提供了强大的日期处理库 `datetime` 来解析 ISO 8601 格式的时间戳并进行运算。 ```python from datetime import datetime, timezone # 输入时间戳 timestamp1 = "2025-03-16T13:33:38+08:00" timestamp2 = "2021-04-22T08:25:10Z" # 解析时间戳 dt1 = datetime.fromisoformat(timestamp1).astimezone(timezone.utc) dt2 = datetime.fromisoformat(timestamp2.replace('Z', '+00:00')).astimezone(timezone.utc) # 计算时间差 delta = dt1 - dt2 print(f"Time difference: {delta.days} days, {delta.seconds} seconds") ``` 此代码片段能够正确解析带有时区偏移量的时间戳,并返回两者的天数和秒数差异[^2]。 --- ### 方法三:基于 Docker 日志功能间接验证时间戳 如果需要对比的是某个容器内的日志时间和外部指定时间,则可借助 `docker logs` 命令提取日志中的时间戳并与目标时间做比较。例如: ```bash CONTAINER_ID=cacf7a960d29 LOG_TIME="2023-04-29T19:22:53" # 获取自 LOG_TIME 后的日志条目 docker logs -t --since="$LOG_TIME" "$CONTAINER_ID" ``` 这一步骤可以帮助确认容器内部事件发生的具体时刻是否晚于给定的参考时间[^3]。 --- ### 总结 无论是采用 Shell 还是 Python 方案,均能有效完成对不同格式时间戳间差距的量化分析工作;而当涉及实际业务场景下的数据校验时,则可能还需要结合具体的上下文信息进一步细化逻辑设计[^4]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值