Bash字符串处理(与Java对照) - 21.字符串正则匹配

Bash字符串处理(与Java对照) - 21.字符串正则匹配

In Java

正则表达式查询

String.matches方法

boolean     matches(String regex)

          通知此字符串是否匹配给定的正则表达式。

String str = "123456";
String re = "\\d+";
if (str.matches(re)) {
    // do something
}
 

Pattern类和Matcher类

String str = "abc efg ABC";
String re = "a|f"; //表示a或f
Pattern p = Pattern.compile(re);
Matcher m = p.matcher(str);
boolean rs = m.find();
 

如果str中有re,那么rs为true,否则为flase。如果想在查找时忽略大小写,则可以写成Pattern p = Pattern.compile(re, Pattern.CASE_INSENSITIVE);

 

正则表达式提取

String re = ".+\\(.+)$";
String str = "c:\\dir1\\dir2\\name.txt";
Pattern p = Pattern.compile(re);
Matcher m = p.matcher(str);
boolean rs = m.find();
for (int i = 1; i <= m.groupCount(); i++) {
    System.out.println(m.group(i));
}

 
以上的执行结果为name.txt,提取的字符串储存在m.group(i)中,其中i最大值为m.groupCount();

 

正则表达式分割

 

String re = "::";
Pattern p = Pattern.compile(re);
String[] r = p.split("xd::abc::cde");

 
执行后,r就是{"xd","abc","cde"},其实分割时还有跟简单的方法:

String str="xd::abc::cde";
String[] r = str.split("::");
 

正则表达式替换(删除)

String re = "a+"; //表示一个或多个a
Pattern p = Pattern.compile(re);
Matcher m = p.matcher("aaabbced a ccdeaa");
String s = m.replaceAll("A");

 

结果为"Abbced A ccdeA"
  
如果写成空串,既可达到删除的功能,比如:

String re = "a+"; //表示一个或多个a
Pattern p = Pattern.compile(re);
Matcher m = p.matcher("aaabbced a ccdeaa");
String s = m.replaceAll("");
 

结果为"bbced ccde"

 

String.replaceAll 和 String.replaceFirst 是可执行正则表达式替换(删除)的简易做法。但String.replace不是按正则表达式来进行的。

JavaDoc class String 写道
String replace(char oldChar, char newChar)
    Returns a new string resulting from replacing all occurrences of oldChar in this string with newChar.
String replace(CharSequence target, CharSequence replacement)
    Replaces each substring of this string that matches the literal target sequence with the specified literal replacement sequence.
String replaceAll(String regex, String replacement)
    Replaces each substring of this string that matches the given regular expression with the given replacement.
String replaceFirst(String regex, String replacement)
    Replaces the first substring of this string that matches the given regular expression with the given replacement.
 

Java中常用的正则表达式元字符

. 代表任意字符
? 表示前面的字符出现0次或1次
+ 表示前面的字符出现1次或多次
* 表示前面的字符出现0次或多次
{n} 表示前面的字符出现正好n次
{n,} 表示前面的字符出现n次或以上
{n,m} 表示前面的字符出现n次到m次
\d 等于 [0-9] 数字
\D 等于 [^0-9] 非数字
\s 等于 [ \t\n\x0B\f ] 空白字元
\S 等于 [^ \t\n\x0B\f ] 非空白字元
\w 等于 [a-zA-Z_0-9] 数字或是英文字
\W 等于 [^a-zA-Z_0-9] 非数字与英文字
^ 表示每行的开头

$ 表示每行的结尾

 

In Bash

关于Linux下正则表达式的说明,详见 http://codingstandards.iteye.com/blog/1195592

 

Bash对正则表达式的支持

Bash v3 内置对正则表达式匹配的支持,操作符为 =~。(Bash Version 3)

[[ "$STR" =~ "$REGEX" ]]

man bash 写道
[[ expression ]]
       An  additional  binary  operator,  =~,  is available, with the same precedence as == and !=.  When it is
       used, the string to the right of the operator is considered an extended regular expression  and  matched
       accordingly (as in regex(3)).  The return value is 0 if the string matches the pattern, and 1 otherwise.
       If the regular expression is syntactically incorrect, the conditional expression’s return  value  is  2.
       If  the shell option nocasematch is enabled, the match is performed without regard to the case of alpha-
       betic characters.  Substrings matched by parenthesized subexpressions within the regular expression  are
       saved  in  the  array variable BASH_REMATCH.  The element of BASH_REMATCH with index 0 is the portion of
       the string matching the entire regular expression.  The element of BASH_REMATCH with index n is the por-
       tion of the string matching the nth parenthesized subexpression.

在Bash中二元操作符 =~ 进行扩展的正则表达式匹配。如果匹配,返回值为0,否则1,如果正则表达式错误,返回2。如果shell选项nocasematch没有开启,那么匹配时 区分大小写。在正则表达式中小括号包围的子表达式的匹配结果保存在BASH_REMATCH中,它是个数组,${BASH_REMATCH[0]}是匹配 的整个字符串,${BASH_REMATCH[1]}是匹配的第一个子表达式的字符串,其他以此类推。

 

以下脚本来自 http://www.linuxjournal.com/content/bash-regular-expressions 很好的展示了Bash3.0中内置的正则表达式匹配功能。

#!/bin/bash

if [[ $# -lt 2 ]]; then
    echo "Usage: $0 PATTERN STRINGS..."
    exit 1
fi
regex=$1
shift
echo "regex: $regex"
echo

while [[ $1 ]]
do
    if [[ $1 =~ $regex ]]; then
        echo "$1 matches"
        i=1
        n=${#BASH_REMATCH[*]}
        while [[ $i -lt $n ]]
        do
            echo "  capture[$i]: ${BASH_REMATCH[$i]}"
            let i++
        done
    else
        echo "$1 does not match"
    fi
    shift
done
 

[root@jfht ~]# ./bashre.sh 'aa(b{2,3}[xyz])cc' aabbxcc aabbcc
regex: aa(b{2,3}[xyz])cc

aabbxcc matches
  capture[1]: bbx
aabbcc does not match
[root@jfht ~]#

 

在grep/egrep命令中进行正则表达式匹配

使用Basic RE

格式1:echo "$STR" | grep -q "$REGEX"

格式2:grep -q "$REGEX" <<<"$STR"

使用Extended RE

格式3:echo "$STR" | egrep -q "$REGEX"

格式4:egrep -q "$REGEX" <<<"$STR"

注意:grep/egrep加上-q参数是为了减少输出,根据退出码判断是否匹配,退出码为0时表示匹配。

man grep 写道
Egrep is the same as grep -E.

       -E, --extended-regexp
              Interpret PATTERN as an extended regular expression (see below).

       -e PATTERN, --regexp=PATTERN
              Use PATTERN as the pattern; useful to protect patterns beginning with -.

       -q, --quiet, --silent
              Quiet;  do  not  write  anything  to standard output.  Exit immediately with zero status if any match is
              found, even if an error was detected.  Also see the -s or --no-messages option.
 

 

匹配手机号码,模式为:1[3458][0-9]{9}  或  1[3458][0-9]\{9\}

[root@jfht ~]# echo "13012345678" | egrep '1[3458][0-9]{9}'
13012345678
[root@jfht ~]# echo "13012345678" | grep '1[3458][0-9]{9}'
[root@jfht ~]# echo "13012345678" | grep '1[3458][0-9]\{9\}'
13012345678
[root@jfht ~]#

 

STR="13024184301"
REGEX="1[3458][0-9]{9}"
if echo "$STR" | egrep -q "$REGEX"; then
    echo "matched"
else
    echo "not matched"
fi

 

 

[root@jfht ~]# STR="13024184301"
[root@jfht ~]# REGEX="1[3458][0-9]{9}"
[root@jfht ~]# if echo "$STR" | egrep -q "$REGEX"; then
>     echo "matched"
> else
>     echo "not matched"
> fi
matched
[root@jfht ~]#

 

使用expr match进行正则表达式匹配

expr match "$STR" "$REGEX"

expr "$STR" : "$REGEX"

打印与正则表达式匹配的长度。

 

man expr 写道
STRING : REGEXP
    anchored pattern match of REGEXP in STRING
match STRING REGEXP
    same as STRING : REGEXP

 

[root@jfht ~]# STR=Hello
[root@jfht ~]# REGEX=He
[root@jfht ~]# expr "$STR" : "$REGEX"
2

[root@jfht ~]# REGEX=".*[aeiou]"
[root@jfht ~]# expr "$STR" : "$REGEX"
5

注意:贪婪匹配!

[root@jfht ~]# REGEX=ll
[root@jfht ~]# expr "$STR" : "$REGEX"
0

 

另外,expr match 也可以实现根据正则表达式取子串。

expr match "$STR" ".*\($SUB\).*"

expr "$STR" : ".*\($SUB\).*"

注意与上面不同的是,结果是子串,而不是匹配的长度。

 

[root@jfht ~]# STR="某某是2009年进公司的"

想从此字符串中提取出数字来,下面是尝试的过程。
[root@jfht ~]# SUB="[0-9]+"
[root@jfht ~]# expr "$STR" : ".*\($SUB\).*"

[root@jfht ~]# SUB="[0-9]\+"               
[root@jfht ~]# expr "$STR" : ".*\($SUB\).*"
9
[root@jfht ~]# SUB="[0-9]*"                
[root@jfht ~]# expr "$STR" : ".*\($SUB\).*"

[root@jfht ~]# SUB="[0-9]\*"               
[root@jfht ~]# expr "$STR" : ".*\($SUB\).*"

 

上面的写法都无法做到提取完整的年份,因为在正则匹配的时候是贪婪匹配,前面.*已经把能匹配的全部吃掉了。
[root@jfht ~]# expr "$STR" : "[^0-9]*\([0-9]\+\).*"
2009

 

网上问题:形如"someletters_12345_moreleters.ext"的文件名,以一些字母开头、跟上下划线、跟上5个数字、再跟上下划线、以一些字母及扩展名结尾。现在需要将数字提取出来,保存到一个变量中。

 

[root@jfht ~]# echo someletters_12345_moreleters.ext | cut -d'_' -f 2
12345

[root@jfht ~]# expr match 'someletters_12345_moreleters.ext' '.\+_\(.\+\)_.*'
12345

 

[root@jfht ~]# FILE=someletters_12345_moreleters.ext
[root@jfht ~]# NUM=$(expr match "$FILE" '.\+_\(.\+\)_.*')
[root@jfht ~]# echo $NUM
12345

 

 

本文链接:http://codingstandards.iteye.com/blog/1208526   (转载请注明出处)

返回目录:Java程序员的Bash实用指南系列之字符串处理(目录) 

上节内容:Bash字符串处理(与Java对照) - 20.查找子串的位置

下节内容:Bash字符串处理(与Java对照) - 22.判断字符串是否数字串

 

 

S7-1200 PN与G120变频器控制起停及调速PROFINET实现详解 S7-1200 PLC与G120变频器通过PROFINET通信可实现高效、实时的电机控制。2. 《S7-1200与G120 CU250S-2PN的PROFINET通讯指南》- 控制器:S7-1200 PLC (如1214C DC/DC/DC)- 变频器:G120 CU250S-2PN (带PROFINET接口)- 输出区(PZD1-2):控制字(16位)、速度设定值(16位)- 输入区(PZD1-2):状态字(16位)、实际速度值(16位)- P922=1:选择报文类型为"标准报文1 (PZD2/2)" 阅读详情

相关推荐

边表法

边表法是用来绘制填充一个面的,边表法的关键是边表和连接边表的扫描线。 对于边的描述利用边表数据结构,包含边与扫描线的交点x坐标,边的最大y坐标,这样可以知道边加入到哪些扫描线上,便还有一个指针来记录扫描线上其它边。 //边数据结构 #pragma once #ifndef __CAETZ__ #define __CAETZ__ #include "pch.h" #include "CPoin...

weixin_42376458的博客 2101

shell编程之正则表达式与文本工具

正则表达式与工具正则表达式grep基础正则表达式常见元字符扩展正则表达式元字符操作的案列命令工具cut:列截取工具sort:排序工具uniq:主要用于去除连续的重复行tr:替换工具 正则表达式 正则表达式,又称规则表达式。(英语: Regular Expression),在代码中常简写为regex、 regexp或 RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。 正则表达式不只有一种,而且 LINUX中不同的程序可能会使用不同的正则表达式,如:工具: grep

xy_1212的博客 674

Cocos Creator 3.x 实战:用脚本动态加载Spine动画,告别resources硬编码

本文详细介绍了Cocos Creator 3.x中Spine动画的动态加载与挂点系统实战技巧。通过Asset Bundle替代传统resources硬编码方式,实现资源的高效管理和热更新支持,同时结合TypeScript强类型和单例模式优化加载流程。文章还深入探讨了跨平台适配、挂点编程方案及性能优化策略,帮助开发者提升游戏开发效率与灵活性。

weixin_42526353的博客 267

Shell 编程之正则表达式与文本处理器--(grep,egrep 与文本处理器-sed、awk、sort、uniq、tr)

文章目录一、正则表达式1.1 正则表达式概述1.1.1 正则表达式的定义1.1.2 正则表达式用途1.2 基础正则表达式1.3 基础正则表达式:grep命令1.3.1 查找特定字符1.3.2 利用中括号“[]”来查找集合字符 一、正则表达式 1.1 正则表达式概述 1.1.1 正则表达式的定义 正则表达式又称正规表达式、常规表达式。在代码中常简写为 regex、regexp 或 RE。正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,简单来说, 是一种匹配字符串的方法,通过一些特殊符

ycycyyc_的博客 1746

聚类教程:cisTopic——来自单细胞表观基因组学数据的顺式调控主题的概率建模

之前运行这步的时候报错了如下: 后来发现原因是Ubuntu自动把R包更新到4.2版本,但是Rstudio版本没有更新,更新Rstudio即可,更新Rstudio的教程看此教程:。

watermel__的博客 1051

ptrade从零开始学量化第1期【ptrade如何新建策略、新建回测、新建交易】什么是ptrade量化交易?

回测之前需要对开始时间、结束时间、回测资金、回测基准、回测频率几个要素进行设定,设定完毕后点击保存。然后再点击回测按键,系统就会开始运行回测,回测的评价指标、收益曲线、日志都会在界面中展现。可以选择不同的业务类型(比如股票),然后给策略设定一个名称,添加成功后可以在默认策略模板基础上进行策略编写。交易界面点击新增按键进行新增交易操作,策略方案中的对象为所有策略列表中的策略,给本次交易设定名称并点击确定后系统就开始运行交易了。交易开始运行后,可以点击交易详情,查看策略评价指标、交易明细、持仓明细、交易日志。

GJ57017_wx的博客 2483

bash在字符串上匹配正则表达式

一、运行截图 警告: 这是少数平台相关的“bash”功能之一。bash将使用用户系统上安装的任何正则表达式引擎。 如果要兼容,请坚持使用符合POSIX规范的正则表达式引擎。 绝大部分发行版Linux中的bash均实现了POSIX规范。 警告: 此示例仅打印第一个匹配组。 使用时多个匹配组需要进行一些修改。 二、示例函数: regex() { # Usage: regex "string" "regex" [[ $1 =~ $2 ]] && print..

张音乐的博客 2672

Revit实战:从零到一,手把手教你用族(Family)搭建一个完整的水闸BIM模型

本文详细介绍了如何使用Revit的族(Family)功能从零开始构建一个完整的水闸BIM模型。通过参数化族设计,实现闸门开度调整自动关联流量计算等智能化功能,提升水利工程BIM模型的工程价值和应用效率。文章涵盖族库规划、核心构件创建、高级技巧及BIM数据深度应用,为水利工程数字化提供实用指南。

weixin_28738165的博客 261

bash正则表达式

1、基本概念 1.1、正则表达式: 正则表达式(regular expression)是一种字符模式(pattern),用来匹配字符串中的子串。 例如: ro+t 可以匹配 root rooot等 ro*t 可以匹配 rot root rooot等 1.1、正则表达式元字符: 元字符是具有特殊含义的字符,不同于字符表面的含义。正则表达式元字...

老赵的博客 2546

OpenClaw人人养虾:接入即时通讯平台Zalo

通过 Zalo Official Account(OA,官方账号)API,可以将 OpenClaw 接入 Zalo,实现面向越南用户的自动化客服和互动。

王国平的博客 437

10、边缘智能学习技术解析

本文深入解析了边缘智能学习技术的四大核心方法:联邦学习、DNN拆分、迁移学习和八卦学习。文章从人类大脑的学习机制出发,引出边缘级智能的重要性,并详细阐述各类技术的架构、优势、挑战及适用场景。通过对比分析,展示了不同技术在隐私性、效率、可扩展性等方面的特性,并探讨了未来融合多种技术、软硬件协同优化及应用领域拓展的发展趋势,为边缘智能在物联网与人工智能领域的应用提供了系统性参考。

ppp33的博客 117

Bash字符串处理(与Java对照) - 23.字符串替换、子串删除、子串截取

Bash字符串处理(与Java对照) - 23.字符串替换、子串删除、子串截取 In Java 字符串替换  String     replace(char oldChar, char newChar)           返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 而生成的。  String     replace(CharSe...

巨人站在肩膀上 633

20、七鳃鳗繁殖与早期生活史:从水质到养殖的全面解析

本文全面解析了七鳃鳗的繁殖与早期生活史,重点探讨了水质对幼体生存的影响、养殖密度与生长关系、变态过程的时间与大小特征,以及人工繁殖在濒危物种恢复和入侵物种控制中的应用。同时,文章分析了大规模养殖面临的挖掘基质需求、空间限制、清洁管理、疾病防控及微生物环境等挑战,并强调实验室养殖对科学研究和种群管理的重要意义。随着技术进步,未来有望扩展更多物种的繁殖研究,揭示七鳃鳗生物学的进化奥秘,实现资源的可持续利用。

l6m7n8的博客 115

BASH字符串处理:字符串分割为数组

http://codingstandards.iteye.com/blog/1164910 Bash字符串处理(与Java对照) - 25.字符串分割(成数组) In Java String.split  String[]     split(String regex)           根据给定的正则表达式的匹配来拆分此字符串。  String[]

zouyongjin的专栏 7763

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

运维面试必备:Bash 中使用正则表达式进行文本处理

正则表达式(Regular Expression)是处理文本的强大工具,Bash 提供了多种使用正则表达式的方法。本文将介绍如何在 Bash 中使用正则表达式进行文本处理。

qq_58299462的博客 717

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

java 字符串截取替换_Bash字符串处理(与Java对照) - 23.字符串替换、子串删除、子串截取...

Bash字符串处理(与Java对照) - 23.字符串替换、子串删除、子串截取In Java字符串替换?String ??? replace(char oldChar, char newChar)????????? 返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 而生成的。?String ??? replace(CharSequence target, C...

weixin_39601641的博客 168

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

java 判断包含6,Bash字符串处置(与Java对照) - 14.判断是否包含另外的字符串(多达6种方法)...

Bash字符串处理(与Java对照) - 14.判断是否包含另外的字符串(多达6种方法)Bash字符串处理(与Java对照) - 14.判断是否包含另外的字符串(多达6种方法)In JavaString.contains & String.indexOfString.contains方法只能判断是否包含某个子串,不能判断是否包含单个字符(当然能判断是否包含单个字符的子串)boolean ...

weixin_36255898的博客 162

Bash字符串处理(与Java对照) - 22.判断字符串是否数字串

Bash字符串处理(与Java对照) - 22.判断字符串是否数字串 In Java 用正则表达式匹配方式判断字符串是否数字串 String str = "1234"; if (str.matches("\\d+")) {     // matched, it's digit string }   In Bash 使用模式匹配(Pattern Matching)判...

巨人站在肩膀上 307

【Linux】Shell 脚本中的字符串处理技巧

本文介绍了Shell脚本中的字符串处理技巧,包括字符串定义与赋值、长度计算、截取与切片等基础操作,并通过密码强度检查和文件路径处理等实战案例展示了这些技巧的应用。文中还提供了对应的Java代码示例,便于开发者对比理解不同语言中的字符串处理方式。文章内容实用,适合Shell脚本初学者和进阶开发者学习参考。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

Bash字符串处理(与Java对照) - 17.判断是否以另外的字符串结尾

Bash字符串处理(与Java对照) - 17.判断是否以另外的字符串结尾 In Java String.endsWith oolean     endsWith(String suffix)           测试此字符串是否以指定的后缀结束。   StringUtils.endsWith &amp; StringUtils.endsWithIgnoreCase &am...

巨人站在肩膀上 325

Bash字符串处理(与Java对照) - 28.去除前后空白

Bash字符串处理(与Java对照) - 28.去除前后空白 In Java String     trim()           返回字符串的副本,忽略前导空白和尾部空白。   In Bash 使用echo命令去除串中的空白 echo $STR 注意 $STR 不要带引号。因为 $STR 展开后,会作为 echo 的参数。那么 echo 在处理参数的时候,自然会...

巨人站在肩膀上 304

Bash字符串处理(与Java对照) - 20.查找子串的位置

Bash字符串处理(与Java对照) - 20.查找子串的位置 转载:http://codingstandards.iteye.com/blog/1199992    In Java String.indexOf   int     indexOf(String str)           返回第一次出现的指定子字符串在此字符串中的索引。  int    

chenweiaiyanyan的专栏 554

Bash字符串处理(与Java对照) - 16.判断是否以另外的字符串开头

Bash字符串处理(与Java对照) - 16.判断是否以另外的字符串开头 In Java String.startsWith  boolean     startsWith(String prefix)           测试此字符串是否以指定的前缀开始。  boolean     startsWith(String prefix, int toffset) ...

巨人站在肩膀上 334

Linux Shell 正则表达式:从入门到实战,玩转文本匹配与处理

正则表达式是 Linux Shell 文本处理的核心,掌握它能让你从“手动筛选”升级为“自动化处理”。区分 BRE 和 ERE 流派,避免转义踩坑;牢记核心元字符(等)的用法;结合 grep(筛选)、sed(替换)、awk(结构化处理)三大工具,覆盖绝大多数场景;多练实战(日志分析、配置修改、数据统计),才能熟练运用。

CharlesYuangc的博客 810
上一篇: 好资料推荐:Linux 101 Hacks 英文原版+中文版PDF下载
下一篇: Bash字符串处理(与Java对照) - 22.判断字符串是否数字串
codingstandards
博客等级 码龄16年 12粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值