Java 在找到的序列之前和之后获取具有n个字符的子字符串

Java 在找到的序列之前和之后获取具有n个字符的子字符串,java,regex,window,substring,Java,Regex,Window,Substring,我有一个名为text的大字符串变量。我希望能够检查文本是否包含指定的搜索字符串(例如“test”),并在匹配之前和之后返回带有窗口大小字符的所有子字符串 例如: String windowSize = 5; String text = "this is only a simple test. lorem impsum testing everything."; String searchString = "test"; 因此,我需要以下输出: mple test. lor ssum testi

我有一个名为
text
的大字符串变量。我希望能够检查
文本
是否包含指定的
搜索字符串
(例如“test”),并在匹配之前和之后返回带有
窗口大小
字符的所有子字符串

例如:

String windowSize = 5;
String text = "this is only a simple test. lorem impsum testing everything.";
String searchString = "test";
因此,我需要以下输出:

mple test. lor
ssum testing e
此外,如果能够有不同类型的输出,那就太好了:

仅在以下情况之前:

mple 
ssum 
只有在:

. lor
ing e
解决方案 多亏了Peter Lawrey和Submitteded,我得到了答案:

String windowSize = 5;
String text = "this is only a simple test. lorem impsum testing everything.";
String searchString = "test";

int i = -1;
while((i = text.indexOf(searchString, i+1)) > -1) {
    System.out.println(text.substring(Math.max(0, i - windowSize), Math.min(i + searchString.length() + windowSize, text.length())));
}

您可以使用
indexOf(string)
方法找到子字符串的位置,如果没有这样的子字符串,这也将返回
-1

您可能希望执行以下操作:

String windowSize = 5;
String text = "this is only a simple test. lorem impsum testing everything.";
String searchString = "test";
int i = -1;
while((i = text.indexOf(test, i + 1)) > -1)
{
    System.out.println(text.substring(i - windowSize, i + searchString.length() + windowSize));
}

您可能需要捕获错误,例如如果
test
的第一次出现少于
windowSize
字符串中的字符。

您可以使用
indexOf(string)
方法找到子字符串的位置,如果没有这样的子字符串,这也将返回
-1

int windowSize = 5;
String text = "this is only a simple test. lorem impsum testing everything.";
String searchString = "test"; 
Pattern pattern = new Pattern ("(.{" + windowSize + "})" + Pattern.Quote (searchString) + "(.{" + windowSize + "})");
您可能希望执行以下操作:

String windowSize = 5;
String text = "this is only a simple test. lorem impsum testing everything.";
String searchString = "test";
int i = -1;
while((i = text.indexOf(test, i + 1)) > -1)
{
    System.out.println(text.substring(i - windowSize, i + searchString.length() + windowSize));
}
您可能需要捕获错误,例如第一次出现的
test
小于字符串中的
windowSize
字符

int windowSize = 5;
String text = "this is only a simple test. lorem impsum testing everything.";
String searchString = "test"; 
Pattern pattern = new Pattern ("(.{" + windowSize + "})" + Pattern.Quote (searchString) + "(.{" + windowSize + "})");
如果你想得到之前或之后,使用第一或第二组匹配。(parenthasis标记前后区域


如果您想得到before或before,请使用第一个或第二个匹配的组。(parenthasis标记before和after区域。

是否必须使用正则表达式?String.indexOf()会更简单更快。您是对的,没有想到更简单的解决方案。是否必须使用正则表达式?String.indexOf()会更简单更快。你是对的,没有想到更简单的解决方案。如果你想匹配WindowsSize,那么使用以下表达式:新模式((.{,“+WindowsSize+”})”+Pattern.Quote(searchString)+“(.{,“+WindowsSize+”})”);//在WindowsSize之前加一个逗号这将只匹配一个,但是您可以添加
+
*
来非常轻松地修复它。如果您想匹配WindowsSize,那么请使用以下表达式:新模式((.{,+WindowsSize+“})”+Pattern.Quote(searchString)+”(.{,+WindowsSize+“})”;//在窗口之前加一个逗号这将只匹配一个,但是你可以添加
+
*
来很容易地修复它。这将导致无限循环,因为
text.indexOf(test)
总是返回相同的结果。啊,当然,我会编辑答案以使用
indexOf(string,startindex)
-我知道我忘了什么!如果你想要
text.indexOf(text,I+1)
,你还需要
Math.max(0,I-windowsSize),Math.min(I+searchString.length()+windowsSize,text.length())
当匹配接近开始和/或结束时。@submitted,它必须是
I+1
,或者你有另一个无限循环。;)谢谢你们。我用结果的解决方案更新了我的问题。这将导致一个无限循环,因为
text.indexOf(test)
总是返回相同的结果。啊,当然,我会编辑答案,使用
indexOf(string,startindex)
-我知道我忘了什么!你想要
text.indexOf(text,I+1)
,您还需要
Math.max(0,i-windowsSize),Math.min(i+searchString.length()+windowSize,text.length())
当匹配接近开始和/或结束时。@submitteded,它必须是
i+1
,或者您有另一个无限循环。;)感谢你们两位。我用结果解决方案更新了我的问题。