package org.springblade.modules.words;
import org.springblade.modules.words.internals.BaseMatchEx;
import java.util.ArrayList;
import java.util.List;
public class StringMatchEx extends BaseMatchEx {
///
/// 在文本中查找第一个关键字
///
/// 文本
///
public String FindFirst(final String text) {
int p = 0;
for (int i = 0; i < text.length(); i++) {
final char t1 = text.charAt(i);
final int t = _dict[t1];
if (t == 0) {
p = 0;
continue;
}
int next;
if (p == 0 || t < _min[p] || t > _max[p]) {
next = _firstIndex[t];
} else {
final int index = _nextIndex[p].IndexOf(t);
if (index == -1) {
if (_wildcard[p] > 0) {
final String r = FindFirst(text, i + 1, _wildcard[p]);
if (r != null) {
return r;
}
}
next = _firstIndex[t];
} else {
next = _nextIndex[p].GetValue(index);
}
}
if (next != 0) {
final int start = _end[next];
if (start < _end[next + 1]) {
final int length = _keywordLength[_resultIndex[start]];
final int s = i - length + 1;
if (s >= 0) {
return text.substring(s, i + 1);
}
}
}
p = next;
}
return null;
}
private String FindFirst(final String text, final int index, int p) {
for (int i = index; i < text.length(); i++) {
final char t1 = text.charAt(i);
final int t = _dict[t1];
if (t == 0) {
return null;
}
int next;
if (p == 0 || t < _min[p] || t > _max[p]) {
next = _firstIndex[t];
} else {
final int index2 = _nextIndex[p].IndexOf(t);
if (index2 == -1) {
if (_wildcard[p] > 0) {
final String r = FindFirst(text, i + 1, _wildcard[p]);
if (r != null) {
return r;
}
}
return null;
} else {
next = _nextIndex[p].GetValue(index2);
}
}
final int start = _end[next];
if (start < _end[next + 1]) {
final int length = _keywordLength[_resultIndex[start]];
final int s = i - length + 1;
if (s >= 0) {
return text.substring(s, i + 1);
}
}
p = next;
}
return null;
}
///
/// 在文本中查找所有的关键字
///
/// 文本
///
public List FindAll(final String text) {
final List result = new ArrayList();
int p = 0;
for (int i = 0; i < text.length(); i++) {
final char t1 = text.charAt(i);
final int t = _dict[t1];
if (t == 0) {
p = 0;
continue;
}
int next;
if (p == 0 || t < _min[p] || t > _max[p]) {
next = _firstIndex[t];
} else {
final int index2 = _nextIndex[p].IndexOf(t);
if (index2 == -1) {
if (_wildcard[p] > 0) {
FindAll(text, i + 1, _wildcard[p], result);
}
next = _firstIndex[t];
} else {
next = _nextIndex[p].GetValue(index2);
}
}
if (next != 0) {
for (int j = _end[next]; j < _end[next + 1]; j++) {
final int length = _keywordLength[_resultIndex[j]];
final int s = i - length + 1;
if (s >= 0) {
final String key = text.substring(s, i + 1);
result.add(key);
}
}
}
p = next;
}
return result;
}
private void FindAll(final String text, final int index, int p, final List result) {
for (int i = index; i < text.length(); i++) {
final char t1 = text.charAt(i);
final int t = _dict[t1];
if (t == 0) {
return;
}
int next;
if (p == 0 || t < _min[p] || t > _max[p]) {
next = _firstIndex[t];
} else {
final int index2 = _nextIndex[p].IndexOf(t);
if (index2 == -1) {
if (_wildcard[p] > 0) {
FindAll(text, i + 1, _wildcard[p], result);
}
return;
} else {
next = _nextIndex[p].GetValue(index2);
}
}
for (int j = _end[next]; j < _end[next + 1]; j++) {
final int length = _keywordLength[_resultIndex[j]];
final int s = i - length + 1;
if (s >= 0) {
final String key = text.substring(s, i + 1);
result.add(key);
}
}
p = next;
}
}
///
/// 判断文本是否包含关键字
///
/// 文本
///
public boolean ContainsAny(final String text) {
int p = 0;
for (int i = 0; i < text.length(); i++) {
final char t1 = text.charAt(i);
final int t = _dict[t1];
if (t == 0) {
p = 0;
continue;
}
int next;
if (p == 0 || t < _min[p] || t > _max[p]) {
next = _firstIndex[t];
} else {
final int index = _nextIndex[p].IndexOf(t);
if (index == -1) {
if (_wildcard[p] > 0) {
final boolean r = ContainsAny(text, i + 1, _wildcard[p]);
if (r) {
return true;
}
}
next = _firstIndex[t];
} else {
next = _nextIndex[p].GetValue(index);
}
}
if (next != 0) {
if (_end[next] < _end[next + 1]) {
return true;
}
}
p = next;
}
return false;
}
private boolean ContainsAny(final String text, final int index, int p) {
for (int i = index; i < text.length(); i++) {
final char t1 = text.charAt(i);
final int t = _dict[t1];
if (t == 0) {
return false;
}
int next;
if (p == 0 || t < _min[p] || t > _max[p]) {
next = _firstIndex[t];
} else {
final int index2 = _nextIndex[p].IndexOf(t);
if (index2 == -1) {
if (_wildcard[p] > 0) {
final boolean r = ContainsAny(text, i + 1, _wildcard[p]);
if (r) {
return true;
}
}
return false;
} else {
next = _nextIndex[p].GetValue(index2);
}
}
final int start = _end[next];
if (start < _end[next + 1]) {
final int length = _keywordLength[_resultIndex[start]];
final int s = i - length + 1;
if (s >= 0) {
return true;
}
}
p = next;
}
return false;
}
///
/// 在文本中替换所有的关键字
///
/// 文本
/// 替换符
///
public String Replace(final String text, final char replaceChar) {
final StringBuilder result = new StringBuilder(text);
int p = 0;
for (int i = 0; i < text.length(); i++) {
final char t1 = text.charAt(i);
final int t = _dict[t1];
if (t == 0) {
p = 0;
continue;
}
int next;
if (p == 0 || t < _min[p] || t > _max[p]) {
next = _firstIndex[t];
} else {
final int index2 = _nextIndex[p].IndexOf(t);
if (index2 == -1) {
if (_wildcard[p] > 0) {
Replace(text, i + 1, _wildcard[p], replaceChar, result);
}
next = _firstIndex[t];
} else {
next = _nextIndex[p].GetValue(index2);
}
}
if (next != 0) {
final int start = _end[next];
if (start < _end[next + 1]) {
final int maxLength = _keywordLength[_resultIndex[start]];
final int start2 = i + 1 - maxLength;
if (start2 >= 0) {
for (int j = start2; j <= i; j++) {
result.setCharAt(j, replaceChar);
}
}
}
}
p = next;
}
return result.toString();
}
private void Replace(final String text, final int index, int p, final char replaceChar,
final StringBuilder result) {
for (int i = index; i < text.length(); i++) {
final char t1 = text.charAt(i);
final int t = _dict[t1];
if (t == 0) {
return;
}
int next;
if (p == 0 || t < _min[p] || t > _max[p]) {
next = _firstIndex[t];
} else {
final int index2 = _nextIndex[p].IndexOf(t);
if (index2 == -1) {
if (_wildcard[p] > 0) {
Replace(text, i + 1, _wildcard[p], replaceChar, result);
}
return;
} else {
next = _nextIndex[p].GetValue(index2);
}
}
final int start = _end[next];
if (start < _end[next + 1]) {
final int maxLength = _keywordLength[_resultIndex[start]];
final int start2 = i + 1 - maxLength;
if (start2 >= 0) {
for (int j = start2; j <= i; j++) {
result.setCharAt(j, replaceChar);
}
}
}
p = next;
}
}
}