第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何通過添加更多字符來知道字符串是否可以匹配正則表達式

如何通過添加更多字符來知道字符串是否可以匹配正則表達式

眼眸繁星 2021-12-18 09:43:29
這是一個棘手的問題,也許最終它沒有解決方案(或者至少不是一個合理的解決方案)。我想要一個特定于 Java 的示例,但如果可以完成,我想我可以用任何示例來完成。我的目標是找到一種方法來了解從輸入流中讀取的字符串是否仍然可以匹配給定的正則表達式模式?;蛘撸瑩Q句話說,讀取流直到我們得到一個絕對不匹配這種模式的字符串,無論你添加多少字符。實現(xiàn)這一點的極簡主義簡單方法的聲明可能是這樣的:boolean couldMatch(CharSequence charsSoFar, Pattern pattern);這種方法會返回true的情況下charsSoFar,如果增加了新的人物還是能模式,或者false如果它有一點機會都沒有與之相匹配的,甚至增加新的人物。舉一個更具體的例子,假設(shè)我們有一個像"^([+-]?\\d*\\.?\\d*)$".使用這樣的模式,couldMatch將返回true以下示例charsSoFar參數(shù):"+"  "-"  "123"  ".24"  "-1.04" 依此類推,因為您可以繼續(xù)為所有這些添加數(shù)字,并在前三個數(shù)字中添加一個點。另一方面,從前一個派生的所有這些示例都應該返回false:"+A"  "-B"  "123z"  ".24."  "-1.04+" 乍一看很明顯,無論您添加多少字符,這些都永遠不會符合上述模式。編輯:我現(xiàn)在添加我當前的非正則表達式方法,以便使事情更清楚。首先,我聲明了以下功能接口:public interface Matcher {    /**     * It will return the matching part of "source" if any.     *     * @param source     * @return     */    CharSequence match(CharSequence source);}然后,之前的函數(shù)將被重新定義為:boolean couldMatch(CharSequence charsSoFar, Matcher matcher);浮點數(shù)的(起草的)匹配器可能看起來像(注意這在開始時不支持 + 號,只支持 -):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();    }}在 canMatch 方法的省略體中,它只會迭代調(diào)用 matcher.match() 并在源參數(shù)的末尾添加一個新字符,并在返回的 CharSequence 等于源參數(shù)時返回 true,并在返回時立即返回 false它是不同的(意味著添加的最后一個字符破壞了匹配)。
查看完整描述

2 回答

?
慕村225694

TA貢獻1880條經(jīng)驗 獲得超4個贊

你可以很容易做到


boolean couldMatch(CharSequence charsSoFar, Pattern pattern) {

    Matcher m = pattern.matcher(charsSoFar);

    return m.matches() || m.hitEnd();

}

如果序列不匹配并且引擎沒有到達輸入的末尾,則意味著在末尾之前存在一個矛盾的字符,在末尾添加更多字符時該字符不會消失。


或者,正如文檔所說:


如果在此匹配器執(zhí)行的最后一次匹配操作中搜索引擎命中了輸入的結(jié)尾,則返回 true。


當此方法返回 true 時,更多輸入可能會更改上次搜索的結(jié)果。


這也在Scanner類內(nèi)部使用,以確定它是否應該從源流加載更多數(shù)據(jù)以進行匹配操作。


將上述方法與您的樣本數(shù)據(jù)一起使用會產(chǎn)生


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

當然,這并沒有說明將不匹配的內(nèi)容變成匹配的可能性。您仍然可以構(gòu)建沒有其他字符可以匹配的模式。但是,對于浮點數(shù)格式這樣的普通用例,這是合理的。


查看完整回答
反對 回復 2021-12-18
?
滄海一幻覺

TA貢獻1824條經(jīng)驗 獲得超5個贊

我沒有具體的解決方案,但你可以用否定來做到這一點。

如果您在黑名單中設(shè)置了與您的模式絕對不匹配的正則表達式模式(例如 + 后跟字符),您可以對照這些進行檢查。如果列入黑名單的正則表達式返回 true,則可以中止。

另一個想法是使用負前瞻(https://www.regular-expressions.info/lookaround.html


查看完整回答
反對 回復 2021-12-18
  • 2 回答
  • 0 關(guān)注
  • 164 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號