`
lizhou
  • 浏览: 109876 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

关键字遍历

 
阅读更多

关键字遍历,用于小文本遍历。

import java.util.Arrays;

public class KeywordTrigger {

	private String[] keywords = null;
	private char[] cs = new char[0];
	private KeywordTriggerHandle handle = null;
	
	private int maxKeywordLength = 0;
	
	public KeywordTrigger(String...keywords) {
		this.keywords = keywords;
		for (String keyword : keywords) {
			if (keyword.length() > maxKeywordLength) {
				maxKeywordLength = keyword.length();
			}
		}
	}
	
	public void parse() {
		StringBuilder sb = new StringBuilder();
		
		char[] tcs = new char[maxKeywordLength];
		for (int i = 0; i < cs.length; i++) {
			char c = cs[i];
			appendChar(tcs, c); // 临时关键字容器填充
			sb.append(c);
			
			for (String keyword : keywords) {
				char[] myKeywords = keyword.toCharArray();
				// 从临时关键字容器中提取关键字,并与指定关键字比较
				if (Arrays.equals(extractCharArray(tcs, myKeywords), myKeywords) == true) {
					// 从字符串中删除关键字
					sb.delete(sb.length() - myKeywords.length, sb.length());
					String str = sb.toString();
					
					if (str != null && !"".equals(str)) {
						handle.contentTrigger(str);
					}
					handle.keywordTrigger(new String(myKeywords));
					
					sb = new StringBuilder();
					tcs = new char[maxKeywordLength];
					continue;
				}
			}
		}
		handle.contentTrigger(sb.toString());
	}
	
	/**
	 * 追加字符,在数组首位置的字符将被抛弃
	 * @param cs
	 * @param c
	 */
	private static void appendChar(char[] cs, char c) {
		int length = cs.length;
		for (int i = 0; i < length; i++) {
			if (i < length - 1) {
				cs[i] = cs[i + 1];
			}
		}
		cs[length - 1] = c;
	}
	
	private static char[] extractCharArray(char[] cs, char[] kwcs) {
		if (cs.length < kwcs.length) {
			throw new IllegalArgumentException("cs length must greater than kwcs length");
		}
		char[] ncs = new char[kwcs.length];
		int st = cs.length - kwcs.length;
		for (int i = 0;i < cs.length; i++) {
			ncs[i] = cs[i + st];
			if (i + st >= cs.length - 1) {
				break;
			}
		}
		return ncs;
	}
	
	public void setSource(String src) {
		cs = src.toCharArray();
	}
	
	public void setHandle(KeywordTriggerHandle handle) {
		this.handle = handle;
	}
	
	public static abstract class KeywordTriggerHandle {
		public abstract void contentTrigger(String str);
		public abstract void keywordTrigger(String keyword);
	}
}

 

 

测试代码:

KeywordTrigger trigger = new KeywordTrigger("<b>", "</b>", "<br>", "<36>", "</36>");
		trigger.setSource("<b>这是标题</b><br><36>hello,这是36号字体</36>okay,信息分析完成。");
		KeywordTrigger trigger = new KeywordTrigger(keywords);
trigger.setHandle(new KeywordTriggerHandle(){
@Override
		public void contentTrigger(String str) {
			printText(str);
		}
@Override
		public void keywordTrigger(String keyword) {
}
});
trigger.parse();

 

分享到:
评论

相关推荐

    momo:Selenium爬虫搜索结果

    用关键字遍历购物网站,将搜寻结果清单存入excel 使用关键字遍历Momo购物网站并将搜索结果列表保存到Excel 专门针对购物网站的产品品项,去做遍历并访问其产品资讯,以供数据分析。 无需登录个人资讯。 投放广告不...

    常见字典用法集锦及代码详解.docx

    3. **Items方法**:返回一个包含所有项的集合,根据关键字遍历。语法:`object.Items` 4. **Exists方法**:检查给定的关键字是否在字典中存在,返回True或False。语法:`object.Exists(key)` 5. **Remove方法**:...

    遍历关键字出现的位置和次数

    用于遍历关键字出现的位置和次数,上传给大家仅供参考与技术交流

    foreach的使用

    `foreach.cpp`通常是实现主程序逻辑的地方,可能包含了使用`foreach`关键字遍历容器的示例。`foreachDlg.cpp`和`foreachDlg.h`可能定义了一个对话框类,用于显示或交互操作,而`foreach.h`可能包含了`foreach`关键字...

    robotFramwork中验证下拉列表值是否正确与查询内容是否正确

    - 使用 `For Loop` 关键字遍历每一行。 - 对于每行的特定列(如第1列和第6列),使用 `Get Text` 关键字获取文本,并使用 `Should Be Equal` 或 `Should Contain` 关键字来验证文本是否符合预期。 - 示例代码片段...

    JavaScript 中使用 Generator的方法

    然而,Generator 允许我们通过 yield 关键字遍历我们自己的代码!这是一种超级强大的语法,实际上,我们可以操纵执行过程!从不太明显的取消操作开始,让我们先从同步操作开始吧。 我为文中提到的功能创建了一个代码...

    详解python中字典的循环遍历的两种方式

    - Python字典可以通过`for`循环和`in`关键字遍历其键。 - 使用`items()`方法可以同时遍历字典的键和值,配合for循环和序列解包可以方便地处理键值对。 - 字典在Python 3.7及更高版本中保持插入顺序,但在其他版本中...

    C#开发实战

    #### 四、使用TYPE关键字遍历窗体控件 1. **遍历窗体上的所有控件**: - 使用`foreach`循环遍历窗体上的所有控件,并根据控件类型执行不同的操作。 ```csharp foreach (Control c in Controls) { if (c....

    VBA遍历文件夹文件匹配关键字内容.zip

    VBA遍历文件夹文件匹配关键字内容.zip

    C++11关于auto关键字的使用示例

    例如,下面是使用auto关键字遍历vector容器的示例: ```c vector&lt;int&gt; v; for (auto it = v.begin(); it != v.end(); it++) { printf("%d ", *it); } ``` auto关键字的注意事项 1. auto关键字类型推断发生在编译...

    python工具,遍历Python关键字

    python工具,遍历Python关键字,直接使用无需任何环境,随时查看Python关键字。

    2021-2022计算机二级等级考试试题及答案No.19673.docx

    - **关键字遍历**:使用 `keys()` 方法。 - **值遍历**:使用 `values()` 方法。 - **元素遍历**:使用 `items()` 方法。 - **示例**: ```python my_dict = {'name': 'John', 'age': 30, 'city': 'New York'} ...

    testmv_遍历文件、查找关键字并按需返回结果_

    "testmv_遍历文件、查找关键字并按需返回结果_"这个标题暗示了一个实用的脚本或程序,它能帮助用户高效地搜索文件内容,找到特定的关键字,并在满足特定条件时返回结果。这种功能对于日志分析、代码审查或者数据挖掘...

    数据结构B树及关键字的插入删除和按层次遍历-Read.pdf

    B树及关键字的插入删除和按层次遍历 B树是一种自平衡的搜索树,它能够保持树的平衡,使得树的高度尽可能小,从而提高搜索效率。B树的每个结点都包含一些关键字和指向子结点的指针,关键字之间是有序的。B树的插入、...

    遍历删除文件夹下所有文件及目录

    "QT遍历删除文件夹下所有文件及目录" 在QT应用程序中,需要遍历删除文件夹下所有文件及目录是一种常见的操作。本文将详细介绍如何使用QT框架实现该功能。 一、使用QDir和QFileInfo遍历删除文件夹 在QT中,可以...

    二叉树的建立及遍历

    本问题涉及的核心知识点是二叉树的遍历及其构造。根据前序和中序遍历序列,我们可以唯一地恢复一棵二叉树。下面我们将详细探讨这个过程。 首先,前序遍历的顺序是根节点 -&gt; 左子树 -&gt; 右子树,而中序遍历的顺序是左...

    [delphi函数]_一个遍历所有文件夹的函数

    例如,在百度搜索中,搜索关键字“I爱你”将被编码为“%CE%D2%B0%AE%C4%E3”,MakeFileList 函数可以将其解码为原始字符串。 MakeFileList 函数是一个非常实用的 Delphi 函数,能够帮助开发者快速遍历文件夹和文件...

    二叉排序树_层次遍历

    二叉排序树(Binary Sort Tree,BST)是一种特殊的二叉查找树(Binary Search Tree,BST),它的每个节点都包含一个关键字,且所有左子树中的关键字都小于当前节点的关键字,所有右子树中的关键字都大于当前节点的...

    php遍历文件及文件夹

    遍历文件夹下所有指定类型的文件及文件夹,有利于开发者迅速查找包含某一函数或关键字的文件

    Freemarker中遍历list集合实例

    `as`关键字用于定义迭代变量。在循环体内,我们可以通过`user`访问当前元素的属性,如用户名、姓名和邮箱。 除了基本的遍历,Freemarker还提供了多种遍历list的扩展功能: 1. **条件判断**:在遍历过程中,可以...

Global site tag (gtag.js) - Google Analytics