正则_action

 数字

import re

s = ['11.5', '454', '6', '32sdf', '0.65', '0.5', '1.0', '454']
for i in s:

if isinstance(s, float) or isinstance(s, int):
return s
return float(s) if re.match('^[0-9]{1,}\.{0,}[0-9]{1,}$', s) else s

 

def check_req_args_time(s):
'''
校验入参的时间参数 '2023-05-23 14:00'
'''
import re
# TODO 更精确的正则规则 \s{1}一个空格
pattern = '^[0-9]{4}-[0-9]{2}-[0-9]{2}\s{1}[0-9]{2}:[0-9]{2}$'
return re.match(pattern, s) is not None
 
 
 
 
\s

匹配一个空白字符,包括空格、制表符、换页符和换行符。等价于 [\f\n\r\t\v\u0020\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]

例如,/\s\w*/ 匹配"foo bar."中的' bar'。

经测试,\s不匹配"\u180e",在当前版本 Chrome(v80.0.3987.122) 和 Firefox(76.0.1) 控制台输入/\s/.test("\u180e") 均返回 false。

 

 

匹配base64编码的png或jpg或jpeg图片

^data:image/(png|jpg|jpeg){1};base64,[0-9a-zA-Z+/=]+=$
 

 

正则与单元测试

 

func chkIntIdStr(str string) bool {
	// 1)1
	// 2)12,23
	// 2)10,23
	r := "^" +
		"([1-9]{1,}[0-9]{0,},){0,}[1-9]{1,}[0-9]{0,}" +
		"$"
	b, err := regexp.MatchString(r, str)
	if err != nil {
		return false
	}
	return b
}


func Test_chkIntIdStr(t *testing.T) {
	type args struct {
		str string
	}
	tests := []struct {
		name string
		args args
		want bool
	}{
		{name: "", args: args{str: ""}, want: false},
		{name: "", args: args{str: "0"}, want: false},
		{name: "", args: args{str: "1"}, want: true},
		{name: "", args: args{str: "1,"}, want: false},
		{name: "", args: args{str: "1,2"}, want: true},
		{name: "", args: args{str: "10,2"}, want: true},
		{name: "x", args: args{str: "1,20"}, want: false},
		{name: "", args: args{str: "1e2"}, want: false},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			if got := chkIntIdStr(tt.args.str); got != tt.want {
				t.Errorf("chkIntIdStr() = %v, want %v", got, tt.want)
			}
		})
	}
}

  

\internal\data\utils_test.go:29: chkIntIdStr() = true, want false
=== RUN   Test_chkIntIdStr/#06
--- FAIL: Test_chkIntIdStr (0.00s)
    --- PASS: Test_chkIntIdStr/#00 (0.00s)
    --- PASS: Test_chkIntIdStr/#01 (0.00s)
    --- PASS: Test_chkIntIdStr/#02 (0.00s)
    --- PASS: Test_chkIntIdStr/#03 (0.00s)
    --- PASS: Test_chkIntIdStr/#04 (0.00s)
    --- PASS: Test_chkIntIdStr/#05 (0.00s)
    --- FAIL: Test_chkIntIdStr/x (0.00s)
    --- PASS: Test_chkIntIdStr/#06 (0.00s)
FAIL
FAIL    WebSvc/internal/data    1.016s

  

 

 

 

 Email邮箱

func ChkEmail(s string) bool {
	r := "^[\\w\\-\\.]{1,}@([\\w\\-]{1,}\\.){0,}[0-9a-zA-Z]{1,}$"
	b, err := regexp.MatchString(r, s)
	if err != nil {
		return false
	}
	return b
}

  

		// TODO: Add test cases.
		{name: "1", args: args{s: "a@a.com"}, want: true},
		{name: "2", args: args{s: "a@a.b.com"}, want: true},
		{name: "3", args: args{s: "1@1.123"}, want: true},
		{name: "4", args: args{s: "1A@1.123A"}, want: true},
		{name: "5", args: args{s: "1-A@1-1.123A"}, want: true},

		{name: "f1", args: args{s: "a@a."}, want: false},
		{name: "f2", args: args{s: "a@.b.com"}, want: false},
		{name: "f2-2", args: args{s: "a@a..b.com"}, want: false},
		{name: "f3", args: args{s: "@1.123"}, want: false},
		{name: "f4", args: args{s: "1A1.123A"}, want: false},

  

function check_email($win)
{
    $win = trim($win);
    $reg = '/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/';
    if (preg_match($reg, $win) == 1) return true;
    return false;
}

 

 

<form action="" method="post" style="text-align: center ">
    <input type="text" name="email_1117" placeholder="请输入您的email(必填)" style="margin:1em;" id="winput_email">
    <input id="winput_email_check" style="border: 0 ;color: red;">
    <input type="submit" name="add" value="追加" id="w_submit">
</form>
<script>
    document.getElementById("winput_email").addEventListener("change", wonchange);
    function wonchange() {
        var w = document.getElementById("winput_email").value;
        var reg = /\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/;
        console.log(reg.exec(w) !== null && reg.exec(w).index === 0)
        if (reg.exec(w) !== null && reg.exec(w).index === 0) {
            document.getElementById("winput_email_check").value = ''
            document.getElementById("w_submit").style.display = 'inline';
        } else {
            winnerhtml = '请输入正确的email';
            document.getElementById("winput_email_check").value = winnerhtml;
            document.getElementById("w_submit").style.display = 'none';
        }
    }
</script>

 

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions

\w
匹配一个单字字符(字母、数字或者下划线)。

等价于[A-Za-z0-9_]。

例如, /\w/ 匹配 "apple," 中的 'a',"$5.28,"中的 '5' 和 "3D." 中的 '3'。

 

+
匹配前面一个表达式1次或者多次。等价于 {1,}。

例如,/a+/匹配了在 "candy" 中的 'a',和在 "caaaaaaandy" 中所有的 'a'。

 

*
匹配前一个表达式0次或多次。等价于 {0,}。

例如,/bo*/会匹配 "A ghost boooooed" 中的 'booooo' 和 "A bird warbled" 中的 'b',但是在 "A goat grunted" 中将不会匹配任何东西。

 

 

http://wiki.ubuntu.org.cn/Python%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97

re.compile('\d+').search('按时打卡的23423') is None



{'words': '大型\t雕铣机\t哪个\t牌子\t好\t?', 'postags': 'b\tn\tr\tn\ta\twp', 'parser': '2:ATT\t4:ATT\t4:ATT\t5:SBV\t0:HED\t5:WP', 'netags': 'O\tO\tO\tO\tO\tO', 'role': [{4: 'A0:(0,3)'}]}
feature ATT SBV HED 相邻

re.compile('ATT\\t\d+:SBV\\t\d+:HED\\t\d+').search( '2:ATT\t4:ATT\t4:ATT\t5:SBV\t0:HED\t5:WP') is None


或 (a|b)
re.compile('HED\\t\d+:VOB\\t\d+:(WP|ADV\\t\d+:CMP)').search('3:ATT\t3:ATT\t4:SBV\t0:HED\t4:VOB\t7:ADV\t4:CMP\t4:WP') is not None


 

http://wiki.ubuntu.org.cn/index.php?title=Python%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97&variant=zh-cn#match.28.29_vs_search.28.29

re.compile('\d+').search('按时打卡的23423') is None


match() vs search()

match() 函数只检查 RE 是否在字符串开始处匹配,而 search() 则是扫描整个字符串。记住这一区别是重要的。记住,match() 只报告一次成功的匹配,它将从 0 处开始;如果匹配不是从 0 开始的,match() 将不会报告它。

 

 

 

http://www.heze.cn/qiye/

区别

http://www.heze.cn/qiye/.{0}$ 匹配成功 

http://www.heze.cn/qiye/

http://www.heze.cn/qiye/.{0}$

 

结尾字符串

http://www.heze.cn/qiye/htt

http://www.heze.cn/qiye/((.{0}$)|(h.+$))

http://www.heze.cn/qiye/((.{0})|(h.+))$

 

 

http://www.heze.cn/qiye/[0-9a-zA-Z]+/show-\d+-\d+.html$

go

reg = regexp.MustCompile("http://www.heze.cn/{0-9a-zA-Z}/(.{0}$)|(list-\\d+-\\d+\\.html$)")

 

 

匹配数据 1-99

^[1-9][0-9]{0,1}[^0-9]{0,1}$

 ^[1-9]{1}[0-9]{0,1}$

 

 

http://cn.sonhoo.com/wukong/c0?offset=150&limit=50

^http://cn.sonhoo.com/wukong/c\d+\?offset=\d+\&limit=\d+$

 

c = colly.NewCollector(
colly.AllowedDomains("cn.sonhoo.com"),
colly.URLFilters(
//请求页面的正则表达式,满足其一即可
regexp.MustCompile("^http://cn.sonhoo.com/wukong/$"),
//regexp.MustCompile("^http://cn.sonhoo.com/wukong/[ac]{1}\\d+$"),
regexp.MustCompile("^http://cn.sonhoo.com/wukong/[c]{1}\\d+$"),
// http://cn.sonhoo.com/wukong/c0?offset=150&limit=50 文章列表页
regexp.MustCompile("^http://cn.sonhoo.com/wukong/c\\d+\\?offset=\\d+\\&limit=\\d+$"),
),



+至少1次
{m,}至少m次

^.+/wukong/u/\d+/index$

^.{0,}/wukong/u/\d+/index$

// http://cn.sonhoo.com/wukong/u/200078/index
reg := regexp.MustCompile("^.{0,}/wukong/u/\\d+/index$")




// 检查href的是否为url
func isUrl(str string) bool {
reg := regexp.MustCompile("^[A-Za-z0-9_\\-\\.\\/\\&\\?\\=]+$")
data := reg.Find([]byte(str))
if (data == nil) {
return false
}
return true
}


[A-Za-z0-9_\-\.\/\&\?\=]

http://www.cnhan.com/pinfo/
http://www.cnhan.com/pinfo/type-22
http://www.cnhan.com/pinfo/type-22-4

^http://www.cnhan.com/pinfo/(.{0}$)|(type-[1-9][0-9]{0,1}(|-[1-9][0-9]{0,1})$)



python
re.match('^http://www.cnhan.com/pinfo/\d+\.html$','http://www.cnhan.com/pinfo/318056a.html') None
SRE_MATCH

go
f := "^http://www.cnhan.com/pinfo/\\d+\\.html$"
reg := regexp.MustCompile(f)
data := reg.Find([]byte(link))
if data != nil {


es

' d d '.replace(/\s/g,'') 去除全部空格
\s
匹配任何不可见字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。

' d d '.replace(/\s/,'') 去除匹配到的第一个空格

' d d '.trim(' ','') 去除首尾的空格


^\s*$ 匹配任何不可见字符
^[\s\S]*\<script\>[\s\S]*\<\/script\>[\s\S]*$ 匹配script

^(\s*$)|([\s\S]*\<script\>[\s\S]*\<\/script\>[\s\S]*$)

 

 

 


\s 匹配任何不可见字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。
.点
匹配除“\n”和"\r"之外的任何单个字符。要匹配包括“\n”和"\r"在内的任何字符,请使用像“[\s\S]”的模式。
*
匹配前面的子表达式任意次。例如,zo*能匹配“z”,也能匹配“zo”以及“zoo”。*等价于{0,}。
+
匹配前面的子表达式一次或多次(大于等于1次)。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。

\<
\>
匹配词(word)的开始(\<)和结束(\>)。例如正则表达式\<the\>能够匹配字符串"for the wise"中的"the",但是不能匹配字符串"otherwise"中的"the"。注意:这个元字符不是所有的软件都支持的。

 

 

 

【new RegExp("test")

var re=new RegExp("test");re.test("test");
true

var re=new RegExp("^\^");re.test("^");
true

var re=new RegExp("^\^");re.test("^");
true
var re=new RegExp("^\\^\\$$");re.test("^$");
true
var re=new RegExp("^\^\$$");re.test("^$");
false

var re=new RegExp("^\\^\\$$");re.test("^$");
true

var re=new RegExp("^\\^/test/\.{1,}\\$$");re.test("^/test/my$");
true

 

var re=new RegExp("\");re.test("\");
VM911:1 Uncaught SyntaxError: missing ) after argument list
var re=new RegExp("\");re.test("\\");
VM915:1 Uncaught SyntaxError: missing ) after argument list
var re=new RegExp("\\");re.test("\\");
VM920:1 Uncaught SyntaxError: Invalid regular expression: /\/: \ at end of pattern
at new RegExp (<anonymous>)
at <anonymous>:1:8
(anonymous) @ VM920:1
var re=new RegExp("\\a");re.test("\\a");
true
var re=new RegExp("\\\");re.test("\\\");
VM939:1 Uncaught SyntaxError: missing ) after argument list
var re=new RegExp("\\\\");re.test("\\\\");
true

 

匹配iPv4
0.
1.

{n,m}
m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。

 

 https://www.jb51.net/article/162641.htm




\w

匹配一个单字字符(字母、数字或者下划线)。等价于 [A-Za-z0-9_]

例如, /\w/ 匹配 "apple," 中的 'a',"$5.28,"中的 '5' 和 "3D." 中的 '3'。

 

(小数点)默认匹配除换行符之外的任何单个字符。

例如,/.n/ 将会匹配 "nay, an apple is on the tree" 中的 'an' 和 'on',但是不会匹配 'nay'。

如果 s ("dotAll") 标志位被设为 true,它也会匹配换行符。

 

*

匹配前一个表达式 0 次或多次。等价于 {0,}

例如,/bo*/ 会匹配 "A ghost boooooed" 中的 'booooo' 和 "A bird warbled" 中的 'b',但是在 "A goat grunted" 中不会匹配任何内容。

 

 

+

匹配前面一个表达式 1 次或者多次。等价于 {1,}

例如,/a+/ 会匹配 "candy" 中的 'a' 和 "caaaaaaandy" 中所有的 'a',但是在 "cndy" 中不会匹配任何内容。

 

 

 

 

?

匹配前面一个表达式 0 次或者 1 次。等价于 {0,1}

例如,/e?le?/ 匹配 "angel" 中的 'el'、"angle" 中的 'le' 以及 "oslo' 中的 'l'。

如果紧跟在任何量词 *、 +、? 或 {} 的后面,将会使量词变为非贪婪(匹配尽量少的字符),和缺省使用的贪婪模式(匹配尽可能多的字符)正好相反。例如,对 "123abc" 使用 /\d+/ 将会匹配 "123",而使用 /\d+?/ 则只会匹配到 "1"。

还用于先行断言中,如本表的 x(?=y) 和 x(?!y) 条目所述。

 

 

\s

Matches a white space character, including space, tab, form feed, line feed. Equivalent to [ \f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff].

For example, /\s\w*/ matches ' bar' in "foo bar."

\S

Matches a character other than white space. Equivalent to [^ \f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff].

For example, /\S*/ matches 'foo' in "foo bar."

 

export function isContainsSpace(s) {
    const reg = /^\s{1,}$/

    return reg.test(s)
}
/**
 * 登录用户名校验
 * @param {string} str
 * @returns {Boolean}
 */
export function validUsername(s) {
    const reg = /^[a-zA-Z]\w{5,11}$/

    return reg.test(s) && !isContainsSpace(s)
}

export const strUserPwdRule = '长度在6~12之间,必须同时含字母和数字,且字符"_$%#@"中的至少一个,且不含其他字符'

/**
 * 登录用户密码校验
 * @param {string} str
 * @returns {Boolean}
 */
export function validUserPwd(s) {
    const reg = /.*\w.*/
    const reg1 = /.*[_$%#@]+.*/
    const reg2 = /^[A-Za-z0-9_$%#@]{6,12}$/
    return reg.test(s) && reg1.test(s) && reg2.test(s) && !isContainsSpace(s)
}
 
url匹配
 
import re

RegExp = '^http://www.abc.com/efgents/60/(warrior|paladin|hunter|shaman|druid|rogue|priest|warlock|mage)/efg/\d{1,128}$

r = re.match(D.RegExp, url)
print(r is not None)

l = ('http://www.abc.com/efgents/60/priest/efg/00000000000000000000000000000000000000000000000',
'http://www.abc.com/efgents/60/mage/efg/0000000000000000000000000000000000000000000000',
'http://www.abc.com/efgents/60/warlock/efg/00000000000000000110000000000000000500000000000000')

 

 

 

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions

 Character classes - JavaScript | MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions/Character_Classes

 

 正则表达式匹配数字范围|极客教程 https://geek-docs.com/regexp/regexp-tutorials/regular-expressions-match-numeric-ranges.html

 

子网掩码

package main

import (
"regexp"
)

func main() {
chk:= func(str string) bool {
// [12]{0,1}[0-9]
// \.
// ([12]{0,1}[0-9]\.) 重复3次 ([12]{0,1}[0-9]\.){3}
// (/(([0-9])|([12][0-9])|(3[012])))可选{0,1}
r := "^" +
"([12]{0,1}[0-9]{0,1}[0-9]{0,1}\\.){3}" +
"([12]{0,1}[0-9]{0,1}[0-9]{0,1})" +
"(/(([0-9])|([12][0-9])|(3[012]))){0,1}" +
"$"

b,err := regexp.MatchString(r,str)
if err!=nil{
panic(err)
}
return b
}

l:=[]string{"12.12.13.0","12.12.13.10","12.12.13.20","12.12.13.0/0","12.12.13.0/10","12.12.13.0/32","12.12.13.20/22","12.12.13.20/33"}
for _,v:=range l{
println(v,chk(v))
}
}

 

掩码位

在线网络计算器 | TCP/IP子网掩码计算换算 —在线工具 https://www.sojson.com/convert/subnetmask.html

 

 

posted @ 2017-12-06 16:34  papering  阅读(392)  评论(0编辑  收藏  举报