精华内容
下载资源
问答
  • 正则表达式反向引用
    2021-03-11 17:13:24

    以前没用过这种用法,mark。

    介绍

    反向引用是基于组的,组就是把多个字符当作单一的单元看待。组是通过在一对小括号(())内放置正则字符来创建的,每对小括号对应一个组。

    反向引用是便捷的,允许重复正则而不需要再写一次。可以通过 \# 来引用前面定义的组,# 是组的序号,从 1 开始。

    正则引擎在处理匹配时,要求 反向引用与所引用的组 匹配的内容必须是一样的:即,(\d\d\d)\1 匹配 123123,而不匹配123456。

    举例

    String str = "123123789789";

    Pattern p = Pattern.compile("(\\d\\d\\d)\\1");

    Matcher m = p.matcher(str);

    System.out.println("group count:" + m.groupCount());

    while (m.find()) {

    String word = m.group();

    System.out.println(word + " " + m.start() + " " + m.end());

    }

    System.out.println("\n\n");

    String pattern = "\\b(\\w+)\\b[\\w\\W]*\\b\\1\\b";

    Pattern p2 = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE);

    String phrase = "unique is not duplicate but unique, Duplicate is duplicate.";

    Matcher m2 = p2.matcher(phrase);

    while (m2.find()) {

    String val = m2.group();

    System.out.println("Matching subsequence is \"" + val + "\"");

    System.out.println("Duplicate word: " + m2.group(1) + "\n");

    }

    输出:

    group count:1

    123123 0 6

    789789 6 12

    Matching subsequence is "unique is not duplicate but unique"

    Duplicate word: unique

    Matching subsequence is "Duplicate is duplicate"

    Duplicate word: Duplicate

    欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。

    更多相关内容
  • Java正则表达式中的反向引用是Java提供的另一个重要功能。 要了解反向引用,我们首先需要了解群组。正则表达式中的分组意味着将多个字符视为一个单元。通过将要分组的字符放在一组括号“()”中来创建它们。每组...
  • I would like to match the following ... Please share your ideas on how to achieve that in Java ? Thank you ! 解决方案 You can use the following regex: ^com\\.my\\.company\\.(?!core).+?\\.MyClassName$

    I would like to match the following

    com.my.company.moduleA.MyClassName

    com.my.company.moduleB.MyClassName

    com.my.company.anythingElse.MyClassName

    but not the following

    com.my.company.core.MyClassName

    My current simple regex pattern is :

    Pattern PATTERN_MODULE_NAME = Pattern.compile("com\\.my\\.company\\.(.*?)\\..*")

    Matcher matcher = PATTERN_MODULE_NAME.matcher(className);

    if (matcher.matches()) {

    // will return the string inside the parentheses (.*?)

    return matcher.group(1);

    }

    So, basically, how can i match everything else, but not a specific string, which is the string core in my case.

    Please share your ideas on how to achieve that in Java ?

    Thank you !

    解决方案

    You can use the following regex:

    ^com\\.my\\.company\\.(?!core).+?\\.MyClassName$

    展开全文
  • 文章目录1 单个字符的匹配规则如下:2 多个字符的匹配规则如下:3 复杂匹配规则主要有:4 提取匹配的字符串子段5 非贪婪匹配6 替换和搜索6.1 分割字符串6.2 搜索字符串6.3 替换字符串6.4 反向引用 1 单个字符的匹配...

    1 单个字符的匹配规则如下:

    在这里插入图片描述

    2 多个字符的匹配规则如下:

    在这里插入图片描述

    3 复杂匹配规则主要有:

    在这里插入图片描述

    4 提取匹配的字符串子段

    Pattern p = Pattern.compile("(\\d{3,4})\\-(\\d{7,8})");
    Matcher m = p.matcher("010-12345678");
    
    正则表达式用(...)分组可以通过Matcher对象快速提取子串:
    - group(0)表示匹配的整个字符串;
    - group(1)表示第1个子串,group(2)表示第2个子串,以此类推。
    

    5 非贪婪匹配

    用表达式

    (\d+)(0*)
    

    去匹配123000,10100,1001结果都是\d+匹配到所有字符而0*未用到,因为正则表达式默认采取贪婪匹配策略(匹配尽可能多的字符),在\d+后边加个?就表示非贪婪(匹配尽可能少的字符),非贪婪如下:

    (\d+?)(0*)
    

    6 替换和搜索

    6.1 分割字符串

    对输入的不规则字符串利用string.split()传入正则表达式提取想要的部分:

    "a b c".split("\\s"); // { "a", "b", "c" }
    "a b  c".split("\\s"); // { "a", "b", "", "c" }
    "a, b ;; c".split("[\\,\\;\\s]+"); // { "a", "b", "c" }
    

    6.2 搜索字符串

    public class Main {
        public static void main(String[] args) {
            String s = "the quick brown fox jumps over the lazy dog.";
            Pattern p = Pattern.compile("\\wo\\w");
            Matcher m = p.matcher(s);
            while (m.find()) {
                String sub = s.substring(m.start(), m.end());
                System.out.println(sub);
            }
        }
    }
    

    output:

    row
    fox
    dog
    

    6.3 替换字符串

    使用正则表达式替换字符串可以直接调用String.replaceAll(),它的第一个参数是正则表达式,第二个参数是待替换的字符串。我们还是来看例子:

    public class Main {
        public static void main(String[] args) {
            String s = "The     quick\t\t brown   fox  jumps   over the  lazy dog.";
            String r = s.replaceAll("\\s+", " ");
            System.out.println(r); // "The quick brown fox jumps over the lazy dog."
        }
    }
    

    6.4 反向引用

    如果我们要把搜索到的指定字符串按规则替换,比如前后各加一个xxxx,这个时候,使用replaceAll()的时候,我们传入的第二个参数可以使用$1、$2来反向引用匹配到的子串。例如:

    public class Main {
        public static void main(String[] args) {
            String s = "the quick brown fox jumps over the lazy dog.";
            String r = s.replaceAll("\\s([a-z]{4})\\s", " <b>$1</b> ");
            System.out.println(r);
        }
    }
    

    output

    the quick brown fox jumps <b>over</b> the <b>lazy</b> dog.
    
    展开全文
  • 正则反向引用

    2021-03-04 08:33:46
    在获取匹配结果的时候,小括号包含的表达式所匹配到的字符串可以单独获取。 “\1” 引用第1对括号内匹配到的字符串,”\2” 引用第2对括号内匹配到的字符串……以此类推。 如果一对括号内包含另一对括号...

    前言

    某日在逛stackoverflow时,发现侧边栏的Hot Network Questions里有一例codegolf的问题Does it repeat?。

    挑战

    好奇之下点入观看,该题主的挑战如下:

    当一条字符串中含有2(组/个)连续的字符时,该字符串可以称之为“连续的字符串”。

    例:2034384538452可以成为“连续的字符串”,因为其含有2次连续的3845。

    请找出能够判断“连续的字符串”的方法,输入可以用字符串或数组,输入不能为空,并且字符串长度必须大于等于1。

    题主使用1与0来区分true和false,挑战者也可以使用其他不同的值来区分true/false。

    abcab -> 0bdefdefg-> 1Hello, World! -> 1pp.pp/pp -> 1q-> 0

    21020121012021020120210121020121012021012102012021020121012021020120210121020120210201210120210121020121012021020120210121020121012021012102012021020121012021012102012101202102012021012102012021020121012021020120210121020121012021012102012021020121012021020120210121020120210201210120210121020121012021020120210121020120210201210120210201202101210201210120210121020120210201210120210121020121012021020120210121020121012021012102012021020121012021020120210121020120210201210120210121020121012021020120 -> 0

    解法

    所有答者中,大部分常用编程语言的答者都使用正则进行判断,例如:

    PHP的解法

    =preg_match('#(.+)\1#',$argn);

    importre

    re.compile(r'(.+)\1').search

    s=>/(.+)\1/.test(s)

    a->a.matches(".*(.+)\\1.*")

    虽然也有使用循环对比来解答的,但这不是我的关注点。

    所有正则的解法中,归根结底就是6个字符(.+)\1

    .+和()的意思好理解,毕竟是常用的。\1虽然能猜到用途,但是无论如何想不起来是干啥的,进入查询模式。

    反向引用(backreference)

    根据揭开正则表达式的神秘面纱一文,发现原来正则除了贪婪和非贪婪外还有名为“反向引用”的高级规则。

    表达式在匹配时,表达式引擎会将小括号 “( )” 包含的表达式所匹配到的字符串记录下来。在获取匹配结果的时候,小括号包含的表达式所匹配到的字符串可以单独获取。

    “\1” 引用第1对括号内匹配到的字符串,”\2” 引用第2对括号内匹配到的字符串……以此类推。

    如果一对括号内包含另一对括号,则外层的括号先排序号。换句话说,哪一对的左括号 “(“ 在前,那这一对为先。

    在正则(.+)\1中,\1等于(.+)中匹配到的值,也就是连续2次相同的值。

    尝试

    使用Python进行快速尝试

    deffa(regex,subject):return re.findall(regex,subject);

    匹配出3连的连续字符串

    fa(r'(.+)\1\1','d123123123e');#['123']

    fa(r'(.+)\1\1','d112233e');#[]

    #或

    fa(r'((.+))\1\2','d123123123e');#['123']

    匹配出html标签内的文字

    fa(r'.*(.*).*','asdwas

    ssdsdasdd');#[('td', 'ssd')]

    fa(r'.*(.*).*','asdwasfind moresda');#[('a', '/a/b','find more')]

    fa(r'.*(.*).*','asdwasfind moresda');#[('a', '/a/b', 'find more')]

    总结

    反向匹配在业务代码中能用的地方不是很多,假如是纯粹去掉html标签的话,php有strip_tags,python也有对应的stripogram包,简略用法看这里。

    多学一点,在leetcode或codewars这类的刷题网站里以最少的代码量达到要求也能有成就感。

    在这里挂个我的codewars肩章,欢迎一起来玩儿。

    large

    Reference

    展开全文
  • 废话不多说,直接上代码:package top.yangxianyang.test;import java.util.regex.Matcher;import java.util.regex.Pattern;...public class Test1 {// 匹配@Testpublic void match() {String qq = "2017-09-19...
  • 1.1 分组反向引用的使用是基于分组的,所以得先理解清楚正则中分组的概念。什么是分组?个人理解的分组是正则匹配的一个或者多个字符,通常像元字符\w,\d,\s只能匹配一个字符,或者 [ ] 范围的匹配也只是匹配一个...
  • 以前写过一篇文章讲解如何使用正则表达式完美解决Html嵌套标签的匹配问题(使用正则表达式匹配嵌套Html标签),但是里头用到了平衡组这样的高级特性,貌似只有DotNet还有Perl正则引擎支持,因此通用性不高。js正则...
  • 乍一看,需求貌视很简单啊,直接上 非贪婪模式的 双向零宽断言(有的资料上也叫 预搜索、预查、环视lookaround):比如,我要匹配串内所有 大写C打头后接数字(C\d+) 以外的 匹配数据,也就是:非贪婪匹配C\d+和后一个C\...
  • 相信大家在看正则表达式语法的时候都会遇到下面几种:正向肯定,正向否定,反向肯定,反向否定 1、(?=pattern) 正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串。 这是一个非获取匹配,该匹配不...
  • Java 正则表达式

    2021-02-26 10:27:48
    Java 正则表达式正则表达式定义了字符串的模式。正则表达式可以用来搜索、编辑或处理文本。正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。正则表达式实例一个字符串其实就是一个简单的正则表达式...
  • 考虑以下字符串:他点了一个凤尾鱼比萨。不幸的是,这不是他想要的。此外,蘑菇,意大利辣香肠和凤尾鱼的比萨比普通的凤尾...为此,我设置了一个正则表达式:(?i:pizza with [a-zA-Z,\s]*?anchovies)这捕获了三场比赛...
  • 1 packagetest1;...56 public classTestExp {7 /**8 *9 * 在使用正则表达式的时候,我们经常会使用()把某个部分括起来,称为一个子模式。 子模式有Capturing和Non-Capturing两种情况。10 * Capt...
  • Java 正则?:?=?!的理解

    2021-04-17 07:01:09
    Java 正则?:?=?!的理解上图是官方文档的介绍,总结一下讲了两个知识点①是否获取匹配并保存匹配的值、②正向预查和反向预查。1:解释是否获取匹配并保存匹配的值()表示捕获分组,获取匹配,()把每个分组里的匹配的值...
  • 本文实例讲述了Java正则环视和反向引用功能与用法。分享给大家供大家参考,具体如下:环视1、环视概念环视,又称为零宽断言,简称断言。环视强调位置(前面或后面),必须匹配环视表达式,才能匹配成功。环视可认为是...
  • 前言,在java中对文字进行匹配时,难免会用到正则匹配,简单记录一下在项目中用到的一些场景 1.基础用法 String con = "(第一条)哈哈哈"; //匹配括号内容 Pattern p1=Pattern.compile("(?<=()[^)]+"); ...
  • JAVA正则表达式 我个人认为正则表达式是很好用很强大的,在编写程序中很多地方都用的到,这里有一些我学习的基础理解和大家分享,欢迎一起讨论。 正则表达式是一种用来表达语法规则的字符串,是一种字符串匹配的模式...
  • 反向引用用于查找重复字符组。 此外可使用反向引用来重新排列输入字符串中各个...使用反向引用可以从正则表达式中引用子表达式。在正则表达式中,每个保存的子匹配项按照它们从左到右出现的顺序存储。 用于存储子...
  • 这一部分主要以Java语言的API为主,因为Java是非常流行的开发语言,如果你之前使用其他开发语言,可以通过这一部分内容来学习基本的技术和方法调用,之后通过其他语言来实现 第3章介绍Java语言的API 第4章解释如何...
  • 这是一个非常基本的正则表达式匹配器,完全基于Java,具有基于超线性时间复杂度实现。 范围 支持的元字符是* +? ()| 和 \。 运算符的优先级是(从最弱的位置开始):|,然后是隐式级联,然后是* +?,并在顶部...
  • Java正则表达式之API

    2022-05-11 17:27:24
    Java正则表达式API也接受预定义的字符类。上面的一些字符类可以用更短的形式表示,尽管这会降低代码的直观性。这个正则表达式的Java版本的一个特殊方面是转义字符。 正如我们将看到的,大多数字符都以反斜杠开头,...
  • java 正则表达式 查找数字

    千次阅读 2021-02-19 09:23:30
    正则表达式 查找数字 数字相关的常用语法: \d 数字字符匹配。等效于 [0-9]。 \D 非数字字符匹配。等效于 [^0-9]。 [xyz] 字符集。匹配包含的任一字符。例如,"[abc]“匹配"plain"中的"a”。 [^xyz] ...
  • JAVA正则表达式

    2021-01-27 01:51:03
    如:^tm :该表达式表示要匹配字串tm的开始位置是行头,如tmequalTomorrowMoon就可以匹配tm$ :该表达式表示要匹配字串tm的位置是行尾,Tomorrow Moon equal tm匹配。如果要匹配的字串可以出现在字符串的任意部分,...
  • java正则表达式解析

    万次阅读 多人点赞 2018-11-08 20:59:07
    一、知道java正则表达式是干什么的? 百度百科定义: 其实这已经说得很明确了,正则表达式其实就是一个字符串,这个字符串是按照一定的规则进行组合得来的,而这个规则当然是创始者定义,用这些规则我们能做什么...
  • Java 正则表达式 SQL匹配

    千次阅读 2018-09-19 20:33:09
    匹配一个单词边界,也就是指单词和空格间的位置(即正则表达式的“匹配”有两种概念,一种是匹配字符,一种是匹配位置,这里的\b就是匹配位置的)。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”...
  • Java正则表达式

    2021-12-17 21:42:30
    Java正则表达式

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,502
精华内容 6,600
关键字:

java正则反向匹配

java 订阅