我正在尝试将两个REGEX查询合并为一个:
\d+\.\d+\.\d+\.\d+
^(?!(10\.|169\.)).*$
我把它写成两部分查询。第一部分将在一个文本块中隔离IP,在我复制并粘贴之后,我选择所有内容,而不是10或169。
似乎我过于复杂了这一点:
答案 0 :(得分:3)
不确定。只需将锚定的负面看向前方:
^(?!10\.|169\.)\d+\.\d+\.\d+\.\d+$
注意:已删除不必要的括号。
要在一行内匹配,即删除锚点并使用“单词边界”\b
作为锚点:
\b(?!10\.|169\.)\d+\.\d+\.\d+\.\d+
答案 1 :(得分:2)
快速和gimme-regex风格的答案
Basic一个(整个字符串看起来像IP):^\d+\.\d+\.\d+\.\d+$
Lite(以句点分隔的4位数字块,整个单词):\b\d+\.\d+\.\d+\.\d+\b
Medium(不包括1.2.4.6.7.9.0
等垃圾邮件:(?<!\d\.)\b\d+\.\d+\.\d+\.\d+\b(?!\.\d+)
Advanced 1(不是以10
或169
开头):(?<!\d\.)\b(?!(?:1(?:0|69))\.)\d+\.\d+\.\d+\.\d+\b(?!\.\d+)
Advanced 2(不以8
或10
结尾):(?<!\d\.)\b\d+\.\d+\.\d+\.(?!(?:8|10)\b)\d+\b(?!\.\d+)
好奇的详细信息
\b
是word boundary,可以匹配确切的&#34;字&#34; (由[a-zA-Z0-9_]
字符组成的实体)在较长的文本中。因此,如果我们不想在12.12.23.56
内匹配g12.12.23.56g
,我们会使用 Lite 版本。
lookarounds连同单词边界,可以进一步限制匹配。如果类似IP的子字符串前面有一个(?<!\d\.)
+ (?!\.\d+)
或者后面跟着digit
+ .
,那么.
- 一个负面的后方 - 以及一个digit
- 一个负向前瞻 - 会使匹配失败一个12.12.34.56.78.90899
+ 10
。因此,我们不匹配169
- 与此正则表达式相似的实体。为这种情况选择 Medium 正则表达式。
现在,您需要将匹配限制为不以某些数值开头的匹配。您需要使用lookbehind或lookahead。 在外观或前瞻解决方案之间进行选择时,更喜欢前瞻,因为1)资源消耗较少,2)更多风味支持它。因此,要使IP第一个数相等的所有匹配失败到(?!(?:1(?:0|69))\.)
或(?!...)
,我们可以使用否定前瞻在前导词:1
。语法为0
,在内部,我们匹配.
后跟1
,然后匹配69
,或.
后跟(?!10\.|169\.)
,然后1
。请注意,我们可以写function makePopunder(pUrl) {
var _parent = (top != self && typeof (top["document"]["location"].toString()) === "string") ? top : self;
var mypopunder = null;
var pName = (Math["floor"]((Math["random"]() * 1000) + 1));
var pWidth = window["innerWidth"];
var pHeight = window["innerHeight"];
var pPosX = window["screenX"];
var pPosY = window["screenY"];
var pWait = 3600;
pWait = (pWait * 1000);
var pCap = 50000;
var todayPops = 0;
var cookie = "_.mypopunder";
var browser = function () {
var n = navigator["userAgent"]["toLowerCase"]();
var b = {
webkit: /webkit/ ["test"](n),
mozilla: (/mozilla/ ["test"](n)) && (!/(compatible|webkit)/ ["test"](n)),
chrome: /chrome/ ["test"](n),
msie: (/msie/ ["test"](n)) && (!/opera/ ["test"](n)),
firefox: /firefox/ ["test"](n),
safari: (/safari/ ["test"](n) && !(/chrome/ ["test"](n))),
opera: /opera/ ["test"](n)
};
b["version"] = (b["safari"]) ? (n["match"](/.+(?:ri)[\\/: ]([\\d.]+)/) || [])[1] : (n["match"](/.+(?:ox|me|ra|ie)[\\/: ]([\\d.]+)/) || [])[1];
return b;
}();
function isCapped() {
try {
todayPops = Math["floor"](document["cookie"]["split"](cookie + "Cap=")[1]["split"](";")[0]);
} catch (err) {};
return (pCap <= todayPops || document["cookie"]["indexOf"](cookie + "=") !== -1);
};
function doPopunder(pUrl, pName, pWidth, pHeight, pPosX, pPosY) {
if (isCapped()) {
return;
};
var sOptions = "toolbar=no,scrollbars=yes,location=yes,statusbar=yes,menubar=no,resizable=1,width=" + pWidth.toString() + ",height=" + pHeight.toString() + ",screenX=" + pPosX + ",screenY=" + pPosY;
document["onclick"] = function (e) {
if (isCapped() || window["pop_clicked"] == 1 || pop_isRightButtonClicked(e)) {
//return;
};
window["pop_clicked"] = 1;
mypopunder = _parent["window"]["open"](pUrl, pName, sOptions);
if (mypopunder) {
var now = new Date();
document["cookie"] = cookie + "=1;expires=" + new Date(now["setTime"](now["getTime"]() + pWait))["toGMTString"]() + ";path=/";
now = new Date();
document["cookie"] = cookie + "Cap=" + (todayPops + 1) + ";expires=" + new Date(now["setTime"](now["getTime"]() + (84600 * 1000)))["toGMTString"]() + ";path=/";
pop2under();
};
};
};
function pop2under() {
try {
mypopunder["blur"]();
mypopunder["opener"]["window"]["focus"]();
window["self"]["window"]["blur"]();
window["focus"]();
if (browser["firefox"]) {
openCloseWindow();
};
if (browser["webkit"]) {
openCloseTab();
};
} catch (e) {};
};
function openCloseWindow() {
var ghost = window["open"]("about:blank");
ghost["focus"]();
ghost["close"]();
};
function openCloseTab() {
var ghost = document["createElement"]("a");
ghost["href"] = "about:blank";
ghost["target"] = "PopHelper";
document["getElementsByTagName"]("body")[0]["appendChild"](ghost);
ghost["parentNode"]["removeChild"](ghost);
var clk = document["createEvent"]("MouseEvents");
clk["initMouseEvent"]("click", true, true, window, 0, 0, 0, 0, 0, true, false, false, true, 0, null);
ghost["dispatchEvent"](clk);
window["open"]("about:blank", "PopHelper")["close"]();
};
function pop_isRightButtonClicked(e) {
var rightclick = false;
e = e || window["event"];
if (e["which"]) {
rightclick = (e["which"] == 3);
} else {
if (e["button"]) {
rightclick = (e["button"] == 2);
};
};
return rightclick;
};
if (isCapped()) {
return;
} else {
doPopunder(pUrl, pName, pWidth, pHeight, pPosX, pPosY);
};
,但会有一些冗余的回溯开销,因为scatter()
部分正在重复。最佳做法是&#34;签约&#34;交替使每个分支的开头不重复,使交替组更加线性。因此,使用 Advanced 1 正则表达式版本来获取这些IP。
类似的情况是 Advanced 2 正则表达式,用于获取一些不以某些值结尾的IP。