正则中的保留字

字符 含义
\ 做为转意,即通常在"\"后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后/\b/,转意为匹配一个单词的边界。
-或- 对正则表达式功能字符的还原,如""匹配它前面元字符0次或多次,/a/将匹配a,aa,aaa,加了"\"后,/a*/将只匹配"a*"。
^ 匹配一个输入或一行的开头,/^a/匹配"an A",而不匹配"An a"
$ 匹配一个输入或一行的结尾,/a$/匹配"An a",而不匹配"an A"
* 匹配前面元字符0次或多次,/ba*/将匹配b,ba,baa,baaa
+ 匹配前面元字符1次或多次,/ba*/将匹配ba,baa,baaa
? 匹配前面元字符0次或1次,/ba*/将匹配b,ba
(x) 匹配x保存x在名为$1...$9的变量中
x|y 匹配x或y
{n} 精确匹配n次
{n,} 匹配n次以上
{n,m} 匹配n-m次
[xyz] 字符集(character set),匹配这个集合中的任一一个字符(或元字符)
[^xyz] 不匹配这个集合中的任何一个字符
[\b] 匹配一个退格符
\b 匹配一个单词的边界
\B 匹配一个单词的非边界
\cX 这儿,X是一个控制符,/\cM/匹配Ctrl-M
\d 匹配一个字数字符,/\d/ = /[0-9]/
\D 匹配一个非字数字符,/\D/ = /[^0-9]/
\n 匹配一个换行符
\r 匹配一个回车符
\s 匹配一个空白字符,包括\n,\r,\f,\t,\v等
\S 匹配一个非空白字符,等于/[^\n\f\r\t\v]/
\t 匹配一个制表符
\v 匹配一个重直制表符
\w 匹配一个可以组成单词的字符(alphanumeric,这是我的意译,含数字),包括下划线,如[\w]匹配"$5.98"中的5,等于[a-zA-Z0-9]
\W 匹配一个不可以组成单词的字符,如[\W]匹配"$5.98"中的$,等于[^a-zA-Z0-9]。

斜方向分割二维数组(lua简易实现)

分析规律(下图为11行-5列示例)

  • 同颜色数字相差值为列数-1
  • 可以产生(行数+列数-1)组数字(如图是15)
  • 每组数字中,每一行最多只有一个(同行号应舍去)

function formatVal(val)
    if val < 10 then return " " .. tostring(val) end
    return tostring(val)
end

local cols = 5
local rows = 11
local t = {}
local gap = " "
for r = 1, rows do
    local line = ""
    for c = 1, cols do
        local val = (r - 1) * cols + c
        table.insert(t, val, val)
        line = line .. " " .. formatVal(val)
    end
    print(line)
end

function SplitBySlash(t, cols, rows)
    local arr2 = {}
    local offset = cols - 1
    for c = 1, rows + cols - 1 do
        local arr = {}
        for r = 1, rows do
            local n = c + (r - 1) * offset
            local fakeR = math.ceil(n / cols)
            if fakeR == r then
                table.insert(arr, n)
                print(n, r, fakeR)
            end

        end
        print("================")
        table.insert(arr2, arr)
    end
    return arr2
end

local function __dump(var, level)
    local rval = {}
    table.insert(rval, "{")
    for k, v in pairs(var) do
        if type(v) == "table" and getmetatable(var) ~= v then
            if k ~= "__base" then
                table.insert(rval, string.format("%s%s=%s",
                                                 string.rep("    ", level), k,
                                                 __dump(v, level + 1)))
            end
        elseif type(v) ~= "function" then
            table.insert(rval, string.format("%s%s=%s",
                                             string.rep("    ", level), k,
                                             tostring(v)))
        end
    end
    table.insert(rval, string.format("%s}", string.rep("    ", level - 1)))
    return table.concat(rval, "\n")
end

local function log(inst)
    if inst == nil then
        print(nil)
        return
    end
    print(__dump(inst, 1))
end

local array2 = SplitBySlash(t, cols, rows)
log(array2)

最终效果

C# 使用LINQ比较两个数组的差异

string[] arrRate = new string[] { "a", "b", "c", "d" };//A
string[] arrTemp = new string[] { "c", "d", "e" };//B

string[] arrUpd = arrRate.Intersect(arrTemp).ToArray();//相同的数据 (结果:c,d)
string[] arrAdd = arrRate.Except(arrTemp).ToArray();//A中有B中没有的 (结果:a,b)
string[] arrNew = arrTemp.Except(arrRate).ToArray();//B中有A中没有的 (结果:e)

关于bash:在sed命令中转义正斜杠

  1. 如果replace内容不包含/这种写法没问题sed"s/regex/replace/" file
  2. 如果replace内容包含/,则改变分割符号为|,完整写法为 sed"s|regex|replace|" file ,这样就不用为\写转义了

常用模拟器adb连接端口

::夜神安卓模拟器 62001
::逍遥安卓模拟器  21503
::蓝叠安卓模拟器  5555
::雷电安卓模拟器 5555
::天天安卓模拟器  5037
::网易MuMu模拟器  7555
::安卓模拟器大师  54001
::腾讯手游助手   5555

adb connect 127.0.0.1:62001
adb logcat -s Unity