java模式匹配之蛮力匹配

java模式匹配之蛮力匹配

/**
 * 模式匹配之蛮力匹配
 */
package javay.util;

/**
 * Pattern Match Brute-Force
 * @author DBJ
 */
public class PMBF {

  /**
   * Pattern Match Brute-Force
   * @param target 目标串
   * @param pattern 模式串
   * @return 模式串在目标串中第一次出现的位置
   */
  public static int patternMatch(String target, String pattern) {
    int targetLength = target.length();
    int patternLength = pattern.length();
    int idxTgt = 0; // 目标串中字符的位置
    int idxPtn = 0; // 模式串中字符的位置

    int index = 0; // 保存与模式串匹配ing的起始字符的位置
    while(idxTgt < targetLength && idxPtn < patternLength) {
      //找到一个匹配的字符
      if(target.charAt(idxTgt) == pattern.charAt(idxPtn)) {
        // 如果相等,则继续对字符进行后续的比较
        idxTgt ++;
        idxPtn ++;
      } else {
        // 否则目标串从第二个字符开始与模式串的第一个字符重新比较
        index ++;
        idxPtn = 0;
        idxTgt = index;
      }
    }
    // 匹配到一个,输出结果
    if(idxPtn == patternLength) {
      //说明匹配成功
      return index;
    } else {
      return -1;
    }
  }
}

使用示例:

static int indexOf(char[] source,char[] target) {
    char first = target[0];
    int max = (source.length - target.length);
    for (int i = 0; i <= max; i++) {
      /* Look for first character. */
      if (source[i] != first) {
        while (++i <= max && source[i] != first);
      }
      /* Found first character, now look at the rest of v2 */
      if (i <= max) {
        int j = i + 1;
        int end = j + target.length - 1;
        for (int k = 1; j < end && source[j] == target[k]; j++, k++);
        if (j == end) {
          /* Found whole string. */
          return i ;
        }
      }
    }
    return -1;
  }

以上所述就是本文的全部内容了,希望大家能够喜欢。

(0)

相关推荐

  • JavaScript 通过模式匹配实现重载

    正好infinte同学提出"更优雅的兼容"其实也和这个问题有一定的关联(我们后面会看到) 在youa的脚本库中Function的Helper中,添加支持重载的模式匹配 复制代码 代码如下: /** * 函数参数重载方法 overload,对函数参数进行模式匹配.默认的dispatcher支持*和...以及?,"*"表示一个任意类型的参数,"..."表示多个任意类型的参数,"?"一般用在",?..."表示0个

  • 用JavaScript对JSON进行模式匹配(Part 1-设计)

    至于筛选条件的描述,模式匹配是一种很常见也很好用的方式.在 JavaScript 里面,用 JSON 来描述模式又是相当方便的事情,所以我们来做一个 JSON 模式匹配工具吧. 用例设计 作为一个 dispatcher ,我们只需要两个方法: notify 和 capture .一个最简单的用例是这样的: 复制代码 代码如下: Dispatcher.capture({ "status": 200, "command": "message" },

  • 用JavaScript对JSON进行模式匹配 (Part 2 - 实现)

    Notify & Capture 要实现 notify 和 capture 就太容易了,我们只需要把 capture 传入的 handler 都保存下来,然后在 notify 里面找到匹配的 handler 就可以了. 复制代码 代码如下: var filterHandlerBundles = []; Dispatch.capture = function(pattern, handler) { var filter = createFilter(pattern); filterHandlerB

  • java模式匹配之蛮力匹配

    java模式匹配之蛮力匹配 /** * 模式匹配之蛮力匹配 */ package javay.util; /** * Pattern Match Brute-Force * @author DBJ */ public class PMBF { /** * Pattern Match Brute-Force * @param target 目标串 * @param pattern 模式串 * @return 模式串在目标串中第一次出现的位置 */ public static int pattern

  • Java正则表达式API边界匹配

    目录 Boundary Matchers Pattern Class Methods Pattern.CANON_EQ Pattern.CASE_INSENSITIVE Pattern.COMMENTS Boundary Matchers Java regex API还支持边界匹配.如果我们关心在输入文本中匹配的确切位置,那么这就是我们要寻找的.在前面的示例中,我们关心的只是是否找到匹配项. 为了仅在文本开头所需的正则表达式为true时匹配,我们使用插入符号^. 此测试将失败,因为可以在开头找到

  • Java使用正则表达式(regex)匹配中文实例代码

    只能输入中文 /** * 22.验证汉字 * 表达式 ^[\u4e00-\u9fa5]{0,}$ * 描述 只能汉字 * 匹配的例子 清清月儿 */ @Test public void a1() { Scanner sc = new Scanner(System.in); String input = sc.nextLine(); String regex = "^[\\u4e00-\\u9fa5]*$"; Matcher m = Pattern.compile(regex).matc

  • java针对电话号码正则匹配实例

    本文实例讲述了java针对电话号码正则匹配的方法.分享给大家供大家参考.具体如下: public interface RegExpConst { /** * 手机号码 * 移动:134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188 * 联通:130,131,132,152,155,156,185,186 * 电信:133,1349,153,180,189 */ String MOBILE = "^1(3[0-9]|5[0-35-

  • Java实现的双向匹配分词算法示例

    本文实例讲述了Java实现的双向匹配分词算法.分享给大家供大家参考,具体如下: 目前比较流行的几大分词算法有:基于字符串匹配的分词方法.基于理解的分词方法和基于统计的分词方法.本文采用的是基于字符串匹配法. 正向最大匹配分词: 该算法是基于分词词典实现,从字符串左侧进行分割匹配,如果词典存在则返回分割出来的词语并将该词从之前的字符串中切除,循环进行切割直到字符串大小为0. 例如:str = "我们都是西北农林科技大学信息工程学院的学生.",(假设我们定义最大切割长度max = 8,也就

  • Java实现的模糊匹配某文件夹下的文件并删除功能示例

    本文实例讲述了Java实现的模糊匹配某文件夹下的文件并删除功能.分享给大家供大家参考,具体如下: package com.wyebd.gis; import java.io.File; /** * @Title: DelFiles.java * @Package com.wyebd.gis * @Description: * @author lisr * @date Mar 7, 2012 5:36:03 PM * @version V1.0 */ public class DelFiles {

  • Java switch多值匹配操作详解

    这篇文章主要介绍了Java switch多值匹配操作详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 我们都知道 switch 用来走流程分支,大多情况下用来匹配单个值,如下面的例子所示: /** * @author 栈长 */ private static void test(int value) { switch (value) { case 1: System.out.println("1"); break; case 2:

  • java如何用正则表达式匹配与提取字符串

    java.util.regex类支持用正则表达式来匹配和提取字符串,读者可以去官网查看java.util.regex的详细使用方法. 首先给出一个匹配字符串的例子(判断line是否符合格式"GraphType\\s*=\\s*\".+\"\\s*"): public static boolean isLegalInputLine(String line ) { Pattern p =Pattern.compile("GraphType\\s*=\\s*\&

  • Java使用正则表达式进行匹配且对匹配结果逐个替换

    前言: Java使用正则表达式进行匹配,并对匹配结果逐个进行替换 下面代码示例,是将 下划线 替换成随机生成的 uuid public class TestUtil { public static void main(String[] args) { // 待匹配替换文本 String html = "姓名:______;年龄:______;性别:______;"; // 正则表达式 String regex = "_+"; Pattern pattern = Pa

  • Java正则之贪婪匹配、惰性匹配

    贪婪量词: 先看整个字符串是不是一个匹配.如果没有发现匹配,它去掉最后字符串中的最后一个字符,并再次尝试.如果还是没有发现匹配,那么    再次去掉最后一个字符串,这个过程会一直重复直到发现一个匹配或者字符串不剩任何字符.简单量词都是贪婪量词. 惰性量词: 先看字符串中的第一个字母是不是一个匹配,如果单独着一个字符还不够,就读入下一个字符,组成两个字符的字符串.如果还没有发现匹配,惰性量词继续从字符串中添加字符直到发现一个匹配或者整个字符串都检查过也没有匹配.惰性量词和贪婪量词的工作方式恰好相反

随机推荐