- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这是一个棘手的问题,也许最终没有解决方案(或者至少不是一个合理的解决方案)。我想要一个特定于 Java 的示例,但如果它可以完成,我想我可以用任何示例来完成。
我的目标是找到一种方法来了解从输入流中读取的字符串是否仍然可以匹配给定的正则表达式模式。或者,换句话说,读取流直到我们得到一个绝对不会匹配这种模式的字符串,无论您向它添加多少字符。
实现此目的的极简简单方法的声明可能类似于:
boolean couldMatch(CharSequence charsSoFar, Pattern pattern);
这样的方法将返回 true
如果 charsSoFar
在添加新字符时仍然可以匹配模式,或者如果没有添加则返回 false
即使添加新字符,也有机会匹配它。
举一个更具体的例子,假设我们有一个 float 模式,如 "^([+-]?\\d*\\.?\\d*)$"
。
使用这样的模式,couldMatch
将为以下示例charsSoFar
参数返回true
:
"+"
"-"
"123"
".24"
"-1.04"
依此类推,因为您可以继续为所有这些添加数字,并在前三个数字中加上一个点。
另一方面,从前一个派生的所有这些示例都应返回 false
:
"+A"
"-B"
"123z"
".24."
"-1.04+"
乍一看,无论您向其中添加多少个字符,这些都永远不会符合上述模式。
编辑:
我现在添加我当前的非正则表达式方法,以使事情更清楚。
首先,我声明以下功能接口(interface):
public interface Matcher {
/**
* It will return the matching part of "source" if any.
*
* @param source
* @return
*/
CharSequence match(CharSequence source);
}
然后,之前的函数将被重新定义为:
boolean couldMatch(CharSequence charsSoFar, Matcher matcher);
float 的(草拟)匹配器可能看起来像(注意这不支持开头的 + 号,只支持 -):
public class FloatMatcher implements Matcher {
@Override
public CharSequence match(CharSequence source) {
StringBuilder rtn = new StringBuilder();
if (source.length() == 0)
return "";
if ("0123456789-.".indexOf(source.charAt(0)) != -1 ) {
rtn.append(source.charAt(0));
}
boolean gotDot = false;
for (int i = 1; i < source.length(); i++) {
if (gotDot) {
if ("0123456789".indexOf(source.charAt(i)) != -1) {
rtn.append(source.charAt(i));
} else
return rtn.toString();
} else if (".0123456789".indexOf(source.charAt(i)) != -1) {
rtn.append(source.charAt(i));
if (source.charAt(i) == '.')
gotDot = true;
} else {
return rtn.toString();
}
}
return rtn.toString();
}
}
在 couldMatch 方法的省略体中,它只会迭代调用 matcher.match() 并在源参数末尾添加一个新字符并返回 true,而返回的 CharSequence 等于源参数,否则返回 false一旦不同(意味着添加的最后一个字符破坏了匹配)。
最佳答案
你可以很容易地做到这一点
boolean couldMatch(CharSequence charsSoFar, Pattern pattern) {
Matcher m = pattern.matcher(charsSoFar);
return m.matches() || m.hitEnd();
}
如果序列不匹配,引擎没有到达输入的末尾,则意味着末尾之前有一个矛盾的字符,在末尾添加更多字符不会消失。
或者,作为 the documentation说:
Returns true if the end of input was hit by the search engine in the last match operation performed by this matcher.
When this method returns true, then it is possible that more input would have changed the result of the last search.
这也被 Scanner
使用内部类,以确定它是否应该从源流加载更多数据以进行匹配操作。
将上述方法与您的示例数据一起使用
Pattern fpNumber = Pattern.compile("[+-]?\\d*\\.?\\d*");
String[] positive = {"+", "-", "123", ".24", "-1.04" };
String[] negative = { "+A", "-B", "123z", ".24.", "-1.04+" };
for(String p: positive) {
System.out.println("should accept more input: "+p
+", couldMatch: "+couldMatch(p, fpNumber));
}
for(String n: negative) {
System.out.println("can never match at all: "+n
+", couldMatch: "+couldMatch(n, fpNumber));
}
should accept more input: +, couldMatch: true
should accept more input: -, couldMatch: true
should accept more input: 123, couldMatch: true
should accept more input: .24, couldMatch: true
should accept more input: -1.04, couldMatch: true
can never match at all: +A, couldMatch: false
can never match at all: -B, couldMatch: false
can never match at all: 123z, couldMatch: false
can never match at all: .24., couldMatch: false
can never match at all: -1.04+, couldMatch: false
当然,这并没有说明将不匹配内容变成匹配内容的可能性。您仍然可以构建任何其他字符都无法匹配的模式。但是,对于像 float 格式这样的普通用例,这是合理的。
关于java - 如何通过添加更多字符来判断字符串是否可以匹配正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53062616/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度理解。包括尝试过的解决方案、为什么它们不起作用,以及预
为什么在 C# 中添加两个 char 结果是 int 类型? 例如,当我这样做时: var pr = 'R' + 'G' + 'B' + 'Y' + 'P'; pr 变量变为 int 类型。我希望它是
下面的代码可以编译,但 char 类型的行为与 int 类型的行为不同。 特别是 cout ::ikIsX >() ::ikIsX >() ::ikIsX >() using names
我正在寻找一个正则表达式,它可以匹配长度为 1 个或多个字符但不匹配 500 的内容。这将在 Rails 路由文件中使用,特别是用于处理异常。 路线.rb match '/500', to: 'err
对于 C 编程作业,我正在尝试编写几个头文件来检查所谓的“X 编程语言”的语法。我最近才开始,正在编写第一个头文件。这是我编写的代码: #ifndef _DeclarationsChecker_h_
为什么扩展的 ascii 字符(â、é 等)被替换为 字符? 我附上了一张图片...但我正在使用 PHP 从 MySQL 中提取数据,其中一些位置有扩展字符...我使用的是 Arial 字体。 您可以
我有一个与 R 中的断线相关的简单问题。 我正在尝试粘贴,但在获取(字符/数字)之间的断线时遇到问题。请注意,这些值包含在向量中(V1=81,V2=55,V3=25)我已经尝试过这段代码: cat(p
如何将 ANSI 字符 (char) 转换为 Unicode 字符 (wchar_t),反之亦然? 是否有用于此目的的任何跨平台源代码? 最佳答案 是的,在 中你有mbstowcs()和 wcsto
函数 fromCharCode 不适用于国际 ANSI 字符。例如,对于 ID 为 192 到 223 的俄语 ANSI (cp-1251) 字符,它返回特殊字符。如何解决这个问题? 我认为,需要将A
如果不喜欢,我想隐藏 id,但不起作用 SELECT * FROM character, character_actor WHERE character.id NOT LIKE character_a
现在这个程序成功地反转了键盘输入的单词。但是我想在我反转它之前“保存”指针中的单词,所以我可以比较两者,反转的和“原始的”,并检查它们是否是回文。我还没有太多经验,可能会出现比我知道的更多的错误,但我
Memcpy 和 memcmp 函数可以接受指针变量吗? char *p; char* q; memcpy(p,q,10); //will this work? memcmp(p,q,10); //w
恐怕我对一个相当过饱和的主题的细节有疑问,我搜索了很多,但找不到一个明确的答案来解决这个特定的明显-imho-重要的问题: 使用UTF-8将byte[]转换为String时,每个字节(8bit)都变成
我有一个奇怪的问题。我需要从 stat 命令打印输出字符串。 我已经编写了获取一些信息的代码。 import glob import os for file in glob.glob('system1
我正在使用 Java 并具有其值如下所示的字符串, String data = "vale-cx"; data = data.replaceAll("\\-", "\\-\\"); 我正在替换其中的“
String urlParameters = "login=test&password=te&ff"; 我有一个String urlParams,& - 是密码的一部分,如何使其转义,从而不被识别为分
大家好,我只想从此字符串中提取第一个字母: String str = "使 徒 行 傳 16:31 ERV-ZH"; 我只想获取这些字符: 使 徒 行 傳 并且不包括 ERV-ZH 仅数
这个问题已经有答案了: Crash or "segmentation fault" when data is copied/scanned/read to an uninitialized point
所以, 我有一个字符**;它本质上是一个句子,带有指向该句子中每个单词的指针;即 'h''i''\0''w''o''r''l''d''\0''y''a''y''!''\0' 在这种情况下,我希望使用可
这个问题在这里已经有了答案: Using quotation marks inside quotation marks (12 个答案) 关闭 7 年前。 如何打印 " 字符? 我知道打印 % 符号
我是一名优秀的程序员,十分优秀!