此代码用于从数据集中提取顺序字母
import java.util.regex.*;
public class IFS {
public static void main(String[] args) {
String a;
a = "ABC1abc";
regexchecker ("\D+", a);
}
public static void regexchecker(String theRegex, String stuffToCheck) {
// compiling the regex pattern
Pattern checkRegex = Pattern.compile(theRegex);
// the regex matcher being joined to the pattern
Matcher regexmatcher = checkRegex.matcher(stuffToCheck);
int end = stuffToCheck.length();
for (int i = 0; i < end; i = i + 1) {
for (int j = i + 1; j <= end; ++j) {
regexmatcher.region(i, j);
while (regexmatcher.find()) {
if (regexmatcher.group().length() != 0) {
System.out.println(regexmatcher.group());
}
}
}
}
}
}
好的,所以我知道我的代码每次都会从j
迭代到结束,但我需要它跳过一个给出相同输出的迭代。
我的输出是
- A
- AB
- ABC
- ABC
- ABCa
- ABC ab
- ABC ABC
等等,当我想要像这样的输出时
- A
- B
- C
- a
- b
- c
- AB
- BC
- ab
- bc
- ABC
- abc
非常感谢您的帮助。我的原始数据集比这个大得多,但为了简单起见,我使用了7个字符集
由于您正在设置要在区域中检查的确切边界,因此您希望排除仅与部分区域匹配的匹配,因为它们将在不同的迭代中找到。由于默认情况下,Matcher在设置区域时将锚点边界应用于区域,因此在正则表达式中使用锚点可以消除重复结果:
regexchecker ("^\D+$", a);
我对您的代码进行了以下更改:
1. Defined an ArrayList to filter those duplicate matches.
2. Small changes on start/end index to the matcher's region
import java.util.regex.*;
import java.util.ArrayList;
public static void main(String[] args) {
String a;
a = "ABC1abc";
regexchecker ("\D+", a);
}
public static void regexchecker(String theRegex, String stuffToCheck) {
// compiling the regex pattern
Pattern checkRegex = Pattern.compile(theRegex);
// the regex matcher being joined to the pattern
Matcher regexmatcher = checkRegex.matcher(stuffToCheck);
// define an ArrayList
ArrayList<String> result = new ArrayList<>();
int end = stuffToCheck.length();
for (int i = 1; i <= end; i++) {
for (int j = 0; j <= end-i; j++) {
regexmatcher.region(j, j + i);
while (regexmatcher.find()) {
if (result.indexOf(regexmatcher.group()) == -1) {
System.out.println(regexmatcher.group());
//result.add(regexmatcher.group());
}
}
}
}
}
输出:
A
B
C
a
b
c
AB
BC
ab
bc
ABC
abc
我发现最简单的方法是先抓住最长的比赛,然后在同一起始位置连续进行较短的比赛。外循环中的find()
定位下一个匹配,然后内循环将区域设置到其边界并稳步缩小。我在内循环中使用lookingAt()
,因为它会自动将匹配固定到区域的开头;可能没有必要,但不管怎样,它就在那里D
public static void regexchecker(String regex, String source)
{
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(source);
int len = source.length();
int start = 0;
int end = len;
while (start < len && m.region(start, len).find())
{
start = m.start();
end = m.end();
while (start < end && m.region(start, end).lookingAt())
{
System.out.println(m.group());
end = m.end() - 1;
}
start++;
}
}
输出:
ABC
AB
A
BC
B
C
abc
ab
a
bc
b
c