regexp.test
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:21k
源码类别:

通讯编程

开发平台:

Visual C++

  1. # Commands covered:  regexp, regsub
  2. #
  3. # This file contains a collection of tests for one or more of the Tcl
  4. # built-in commands.  Sourcing this file into Tcl runs the tests and
  5. # generates output for errors.  No output means no errors were found.
  6. #
  7. # Copyright (c) 1991-1993 The Regents of the University of California.
  8. # Copyright (c) 1998 Sun Microsystems, Inc.
  9. # Copyright (c) 1998-1999 by Scriptics Corporation.
  10. #
  11. # See the file "license.terms" for information on usage and redistribution
  12. # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  13. #
  14. # RCS: @(#) $Id: regexp.test,v 1.22.2.4 2007/11/15 22:01:10 dgp Exp $
  15. if {[lsearch [namespace children] ::tcltest] == -1} {
  16.     package require tcltest 2
  17.     namespace import -force ::tcltest::*
  18. }
  19. catch {unset foo}
  20. test regexp-1.1 {basic regexp operation} {
  21.     regexp ab*c abbbc
  22. } 1
  23. test regexp-1.2 {basic regexp operation} {
  24.     regexp ab*c ac
  25. } 1
  26. test regexp-1.3 {basic regexp operation} {
  27.     regexp ab*c ab
  28. } 0
  29. test regexp-1.4 {basic regexp operation} {
  30.     regexp -- -gorp abc-gorpxxx
  31. } 1
  32. test regexp-1.5 {basic regexp operation} {
  33.     regexp {^([^ ]*)[ ]*([^ ]*)} "" a
  34. } 1
  35. test regexp-1.6 {basic regexp operation} {
  36.     list [catch {regexp {} abc} msg] $msg
  37. } {0 1}
  38. test regexp-1.7 {regexp utf compliance} {
  39.     # if not UTF-8 aware, result is "0 1"
  40.     set foo "u4e4eb q"
  41.     regexp "u4e4eb q" "au4e4eb qwu5e4ex4e wq" bar
  42.     list [string compare $foo $bar] [regexp 4 $bar]
  43. } {0 0}
  44. test regexp-2.1 {getting substrings back from regexp} {
  45.     set foo {}
  46.     list [regexp ab*c abbbbc foo] $foo
  47. } {1 abbbbc}
  48. test regexp-2.2 {getting substrings back from regexp} {
  49.     set foo {}
  50.     set f2 {}
  51.     list [regexp a(b*)c abbbbc foo f2] $foo $f2
  52. } {1 abbbbc bbbb}
  53. test regexp-2.3 {getting substrings back from regexp} {
  54.     set foo {}
  55.     set f2 {}
  56.     list [regexp a(b*)(c) abbbbc foo f2] $foo $f2
  57. } {1 abbbbc bbbb}
  58. test regexp-2.4 {getting substrings back from regexp} {
  59.     set foo {}
  60.     set f2 {}
  61.     set f3 {}
  62.     list [regexp a(b*)(c) abbbbc foo f2 f3] $foo $f2 $f3
  63. } {1 abbbbc bbbb c}
  64. test regexp-2.5 {getting substrings back from regexp} {
  65.     set foo {}; set f1 {}; set f2 {}; set f3 {}; set f4 {}; set f5 {};
  66.     set f6 {}; set f7 {}; set f8 {}; set f9 {}; set fa {}; set fb {};
  67.     list [regexp (1*)(2*)(3*)(4*)(5*)(6*)(7*)(8*)(9*)(a*)(b*) 
  68.       12223345556789999aabbb 
  69.     foo f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb] $foo $f1 $f2 $f3 $f4 $f5 
  70.     $f6 $f7 $f8 $f9 $fa $fb
  71. } {1 12223345556789999aabbb 1 222 33 4 555 6 7 8 9999 aa bbb}
  72. test regexp-2.6 {getting substrings back from regexp} {
  73.     set foo 2; set f2 2; set f3 2; set f4 2
  74.     list [regexp (a)(b)? xay foo f2 f3 f4] $foo $f2 $f3 $f4
  75. } {1 a a {} {}}
  76. test regexp-2.7 {getting substrings back from regexp} {
  77.     set foo 1; set f2 1; set f3 1; set f4 1
  78.     list [regexp (a)(b)?(c) xacy foo f2 f3 f4] $foo $f2 $f3 $f4
  79. } {1 ac a {} c}
  80. test regexp-2.8 {getting substrings back from regexp} {
  81.     set match {}
  82.     list [regexp {^a*b} aaaab match] $match
  83. } {1 aaaab}
  84. test regexp-2.9 {getting substrings back from regexp} {
  85.     set foo {}
  86.     set f2 {}
  87.     list [regexp f352te(b*)c f352tebbbbc foo f2] $foo $f2
  88. } [list 1 f352tebbbbc bbbb]
  89. test regexp-2.10 {getting substrings back from regexp} {
  90.     set foo {}
  91.     set f2 {}
  92.     list [regexp f352te(b*)c eff352tebbbbc foo f2] $foo $f2
  93. } [list 1 f352tebbbbc bbbb]
  94. test regexp-3.1 {-indices option to regexp} {
  95.     set foo {}
  96.     list [regexp -indices ab*c abbbbc foo] $foo
  97. } {1 {0 5}}
  98. test regexp-3.2 {-indices option to regexp} {
  99.     set foo {}
  100.     set f2 {}
  101.     list [regexp -indices a(b*)c abbbbc foo f2] $foo $f2
  102. } {1 {0 5} {1 4}}
  103. test regexp-3.3 {-indices option to regexp} {
  104.     set foo {}
  105.     set f2 {}
  106.     list [regexp -indices a(b*)(c) abbbbc foo f2] $foo $f2
  107. } {1 {0 5} {1 4}}
  108. test regexp-3.4 {-indices option to regexp} {
  109.     set foo {}
  110.     set f2 {}
  111.     set f3 {}
  112.     list [regexp -indices a(b*)(c) abbbbc foo f2 f3] $foo $f2 $f3
  113. } {1 {0 5} {1 4} {5 5}}
  114. test regexp-3.5 {-indices option to regexp} {
  115.     set foo {}; set f1 {}; set f2 {}; set f3 {}; set f4 {}; set f5 {};
  116.     set f6 {}; set f7 {}; set f8 {}; set f9 {}
  117.     list [regexp -indices (1*)(2*)(3*)(4*)(5*)(6*)(7*)(8*)(9*) 
  118.     12223345556789999 
  119.     foo f1 f2 f3 f4 f5 f6 f7 f8 f9] $foo $f1 $f2 $f3 $f4 $f5 
  120.     $f6 $f7 $f8 $f9
  121. } {1 {0 16} {0 0} {1 3} {4 5} {6 6} {7 9} {10 10} {11 11} {12 12} {13 16}}
  122. test regexp-3.6 {getting substrings back from regexp} {
  123.     set foo 2; set f2 2; set f3 2; set f4 2
  124.     list [regexp -indices (a)(b)? xay foo f2 f3 f4] $foo $f2 $f3 $f4
  125. } {1 {1 1} {1 1} {-1 -1} {-1 -1}}
  126. test regexp-3.7 {getting substrings back from regexp} {
  127.     set foo 1; set f2 1; set f3 1; set f4 1
  128.     list [regexp -indices (a)(b)?(c) xacy foo f2 f3 f4] $foo $f2 $f3 $f4
  129. } {1 {1 2} {1 1} {-1 -1} {2 2}}
  130. test regexp-4.1 {-nocase option to regexp} {
  131.     regexp -nocase foo abcFOo
  132. } 1
  133. test regexp-4.2 {-nocase option to regexp} {
  134.     set f1 22
  135.     set f2 33
  136.     set f3 44
  137.     list [regexp -nocase {a(b*)([xy]*)z} aBbbxYXxxZ22 f1 f2 f3] $f1 $f2 $f3
  138. } {1 aBbbxYXxxZ Bbb xYXxx}
  139. test regexp-4.3 {-nocase option to regexp} {
  140.     regexp -nocase FOo abcFOo
  141. } 1
  142. set x abcdefghijklmnopqrstuvwxyz1234567890
  143. set x $x$x$x$x$x$x$x$x$x$x$x$x
  144. test regexp-4.4 {case conversion in regexp} {
  145.     list [regexp -nocase $x $x foo] $foo
  146. } "1 $x"
  147. catch {unset x}
  148. test regexp-5.1 {exercise cache of compiled expressions} {
  149.     regexp .*a b
  150.     regexp .*b c
  151.     regexp .*c d
  152.     regexp .*d e
  153.     regexp .*e f
  154.     regexp .*a bbba
  155. } 1
  156. test regexp-5.2 {exercise cache of compiled expressions} {
  157.     regexp .*a b
  158.     regexp .*b c
  159.     regexp .*c d
  160.     regexp .*d e
  161.     regexp .*e f
  162.     regexp .*b xxxb
  163. } 1
  164. test regexp-5.3 {exercise cache of compiled expressions} {
  165.     regexp .*a b
  166.     regexp .*b c
  167.     regexp .*c d
  168.     regexp .*d e
  169.     regexp .*e f
  170.     regexp .*c yyyc
  171. } 1
  172. test regexp-5.4 {exercise cache of compiled expressions} {
  173.     regexp .*a b
  174.     regexp .*b c
  175.     regexp .*c d
  176.     regexp .*d e
  177.     regexp .*e f
  178.     regexp .*d 1d
  179. } 1
  180. test regexp-5.5 {exercise cache of compiled expressions} {
  181.     regexp .*a b
  182.     regexp .*b c
  183.     regexp .*c d
  184.     regexp .*d e
  185.     regexp .*e f
  186.     regexp .*e xe
  187. } 1
  188. test regexp-6.1 {regexp errors} {
  189.     list [catch {regexp a} msg] $msg
  190. } {1 {wrong # args: should be "regexp ?switches? exp string ?matchVar? ?subMatchVar subMatchVar ...?"}}
  191. test regexp-6.2 {regexp errors} {
  192.     list [catch {regexp -nocase a} msg] $msg
  193. } {1 {wrong # args: should be "regexp ?switches? exp string ?matchVar? ?subMatchVar subMatchVar ...?"}}
  194. test regexp-6.3 {regexp errors} {
  195.     list [catch {regexp -gorp a} msg] $msg
  196. } {1 {bad switch "-gorp": must be -all, -about, -indices, -inline, -expanded, -line, -linestop, -lineanchor, -nocase, -start, or --}}
  197. test regexp-6.4 {regexp errors} {
  198.     list [catch {regexp a( b} msg] $msg
  199. } {1 {couldn't compile regular expression pattern: parentheses () not balanced}}
  200. test regexp-6.5 {regexp errors} {
  201.     list [catch {regexp a( b} msg] $msg
  202. } {1 {couldn't compile regular expression pattern: parentheses () not balanced}}
  203. test regexp-6.6 {regexp errors} {
  204.     list [catch {regexp a a f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1} msg] $msg
  205. } {0 1}
  206. test regexp-6.7 {regexp errors} {
  207.     list [catch {regexp (x)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.) xyzzy} msg] $msg
  208. } {0 0}
  209. test regexp-6.8 {regexp errors} {
  210.     catch {unset f1}
  211.     set f1 44
  212.     list [catch {regexp abc abc f1(f2)} msg] $msg
  213. } {1 {couldn't set variable "f1(f2)"}}
  214. test regexp-6.9 {regexp errors, -start bad int check} {
  215.     list [catch {regexp -start bogus {^$} {}} msg] $msg
  216. } {1 {expected integer but got "bogus"}}
  217. test regexp-7.1 {basic regsub operation} {
  218.     list [regsub aa+ xaxaaaxaa 111&222 foo] $foo
  219. } {1 xax111aaa222xaa}
  220. test regexp-7.2 {basic regsub operation} {
  221.     list [regsub aa+ aaaxaa &111 foo] $foo
  222. } {1 aaa111xaa}
  223. test regexp-7.3 {basic regsub operation} {
  224.     list [regsub aa+ xaxaaa 111& foo] $foo
  225. } {1 xax111aaa}
  226. test regexp-7.4 {basic regsub operation} {
  227.     list [regsub aa+ aaa 11&2&333 foo] $foo
  228. } {1 11aaa2aaa333}
  229. test regexp-7.5 {basic regsub operation} {
  230.     list [regsub aa+ xaxaaaxaa &2&333 foo] $foo
  231. } {1 xaxaaa2aaa333xaa}
  232. test regexp-7.6 {basic regsub operation} {
  233.     list [regsub aa+ xaxaaaxaa 1&22& foo] $foo
  234. } {1 xax1aaa22aaaxaa}
  235. test regexp-7.7 {basic regsub operation} {
  236.     list [regsub a(a+) xaxaaaxaa {11221} foo] $foo
  237. } {1 xax1aa22aaxaa}
  238. test regexp-7.8 {basic regsub operation} {
  239.     list [regsub a(a+) xaxaaaxaa {1\1221} foo] $foo
  240. } "1 {xax1\aa22aaxaa}"
  241. test regexp-7.9 {basic regsub operation} {
  242.     list [regsub a(a+) xaxaaaxaa {1\1221} foo] $foo
  243. } "1 {xax1\122aaxaa}"
  244. test regexp-7.10 {basic regsub operation} {
  245.     list [regsub a(a+) xaxaaaxaa {1\&1} foo] $foo
  246. } "1 {xax1\aaaaaxaa}"
  247. test regexp-7.11 {basic regsub operation} {
  248.     list [regsub a(a+) xaxaaaxaa {1&1} foo] $foo
  249. } {1 xax1&aaxaa}
  250. test regexp-7.12 {basic regsub operation} {
  251.     list [regsub a(a+) xaxaaaxaa {1111&&} foo] $foo
  252. } {1 xaxaaaaaaaaaaaaaaxaa}
  253. test regexp-7.13 {basic regsub operation} {
  254.     set foo xxx
  255.     list [regsub abc xyz 111 foo] $foo
  256. } {0 xyz}
  257. test regexp-7.14 {basic regsub operation} {
  258.     set foo xxx
  259.     list [regsub ^ xyz "111 " foo] $foo
  260. } {1 {111 xyz}}
  261. test regexp-7.15 {basic regsub operation} {
  262.     set foo xxx
  263.     list [regsub -- -foo abc-foodef "111 " foo] $foo
  264. } {1 {abc111 def}}
  265. test regexp-7.16 {basic regsub operation} {
  266.     set foo xxx
  267.     list [regsub x "" y foo] $foo
  268. } {0 {}}
  269. test regexp-7.17 {regsub utf compliance} {
  270.     # if not UTF-8 aware, result is "0 1"
  271.     set foo "xyz555ijkau4e4ebpqr"
  272.     regsub au4e4eb xyzau4e4ebijkau4e4ebpqr 555 bar
  273.     list [string compare $foo $bar] [regexp 4 $bar]
  274. } {0 0}
  275. test regexp-8.1 {case conversion in regsub} {
  276.     list [regsub -nocase a(a+) xaAAaAAay & foo] $foo
  277. } {1 xaAAaAAay}
  278. test regexp-8.2 {case conversion in regsub} {
  279.     list [regsub -nocase a(a+) xaAAaAAay & foo] $foo
  280. } {1 xaAAaAAay}
  281. test regexp-8.3 {case conversion in regsub} {
  282.     set foo 123
  283.     list [regsub a(a+) xaAAaAAay & foo] $foo
  284. } {0 xaAAaAAay}
  285. test regexp-8.4 {case conversion in regsub} {
  286.     set foo 123
  287.     list [regsub -nocase a CaDE b foo] $foo
  288. } {1 CbDE}
  289. test regexp-8.5 {case conversion in regsub} {
  290.     set foo 123
  291.     list [regsub -nocase XYZ CxYzD b foo] $foo
  292. } {1 CbD}
  293. test regexp-8.6 {case conversion in regsub} {
  294.     set x abcdefghijklmnopqrstuvwxyz1234567890
  295.     set x $x$x$x$x$x$x$x$x$x$x$x$x
  296.     set foo 123
  297.     list [regsub -nocase $x $x b foo] $foo
  298. } {1 b}
  299. test regexp-9.1 {-all option to regsub} {
  300.     set foo 86
  301.     list [regsub -all x+ axxxbxxcxdx |&| foo] $foo
  302. } {4 a|xxx|b|xx|c|x|d|x|}
  303. test regexp-9.2 {-all option to regsub} {
  304.     set foo 86
  305.     list [regsub -nocase -all x+ aXxXbxxcXdx |&| foo] $foo
  306. } {4 a|XxX|b|xx|c|X|d|x|}
  307. test regexp-9.3 {-all option to regsub} {
  308.     set foo 86
  309.     list [regsub x+ axxxbxxcxdx |&| foo] $foo
  310. } {1 a|xxx|bxxcxdx}
  311. test regexp-9.4 {-all option to regsub} {
  312.     set foo 86
  313.     list [regsub -all bc axxxbxxcxdx |&| foo] $foo
  314. } {0 axxxbxxcxdx}
  315. test regexp-9.5 {-all option to regsub} {
  316.     set foo xxx
  317.     list [regsub -all node "node node more" yy foo] $foo
  318. } {2 {yy yy more}}
  319. test regexp-9.6 {-all option to regsub} {
  320.     set foo xxx
  321.     list [regsub -all ^ xxx 123 foo] $foo
  322. } {1 123xxx}
  323. test regexp-10.1 {expanded syntax in regsub} {
  324.     set foo xxx
  325.     list [regsub -expanded ". #commentn  . #comment2" abc def foo] $foo
  326. } {1 defc}
  327. test regexp-10.2 {newline sensitivity in regsub} {
  328.     set foo xxx
  329.     list [regsub -line {^a.*b$} "dabcnaxybn" 123 foo] $foo
  330. } "1 {dabcn123n}"
  331. test regexp-10.3 {newline sensitivity in regsub} {
  332.     set foo xxx
  333.     list [regsub -line {^a.*b$} "dabcnaxybnxb" 123 foo] $foo
  334. } "1 {dabcn123nxb}"
  335. test regexp-10.4 {partial newline sensitivity in regsub} {
  336.     set foo xxx
  337.     list [regsub -lineanchor {^a.*b$} "danaxybnxb" 123 foo] $foo
  338. } "1 {dan123}"
  339. test regexp-10.5 {inverse partial newline sensitivity in regsub} {
  340.     set foo xxx
  341.     list [regsub -linestop {a.*b} "danbaxybnxb" 123 foo] $foo
  342. } "1 {danb123nxb}"
  343. test regexp-11.1 {regsub errors} {
  344.     list [catch {regsub a b} msg] $msg
  345. } {1 {wrong # args: should be "regsub ?switches? exp string subSpec ?varName?"}}
  346. test regexp-11.2 {regsub errors} {
  347.     list [catch {regsub -nocase a b} msg] $msg
  348. } {1 {wrong # args: should be "regsub ?switches? exp string subSpec ?varName?"}}
  349. test regexp-11.3 {regsub errors} {
  350.     list [catch {regsub -nocase -all a b} msg] $msg
  351. } {1 {wrong # args: should be "regsub ?switches? exp string subSpec ?varName?"}}
  352. test regexp-11.4 {regsub errors} {
  353.     list [catch {regsub a b c d e f} msg] $msg
  354. } {1 {wrong # args: should be "regsub ?switches? exp string subSpec ?varName?"}}
  355. test regexp-11.5 {regsub errors} {
  356.     list [catch {regsub -gorp a b c} msg] $msg
  357. } {1 {bad switch "-gorp": must be -all, -nocase, -expanded, -line, -linestop, -lineanchor, -start, or --}}
  358. test regexp-11.6 {regsub errors} {
  359.     list [catch {regsub -nocase a( b c d} msg] $msg
  360. } {1 {couldn't compile regular expression pattern: parentheses () not balanced}}
  361. test regexp-11.7 {regsub errors} {
  362.     catch {unset f1}
  363.     set f1 44
  364.     list [catch {regsub -nocase aaa aaa xxx f1(f2)} msg] $msg
  365. } {1 {couldn't set variable "f1(f2)"}}
  366. test regexp-11.8 {regsub errors, -start bad int check} {
  367.     list [catch {regsub -start bogus pattern string rep var} msg] $msg
  368. } {1 {expected integer but got "bogus"}}
  369. test regexp-11.9 {regsub without final variable name returns value} {
  370.     regsub b abaca X
  371. } {aXaca}
  372. test regexp-11.10 {regsub without final variable name returns value} {
  373.     regsub -all a abaca X
  374. } {XbXcX}
  375. test regexp-11.11 {regsub without final variable name returns value} {
  376.     regsub b(.*?)d abcdeabcfde {,&,1,}
  377. } {a,bcd,c,eabcfde}
  378. test regexp-11.12 {regsub without final variable name returns value} {
  379.     regsub -all b(.*?)d abcdeabcfde {,&,1,}
  380. } {a,bcd,c,ea,bcfd,cf,e}
  381. # This test crashes on the Mac unless you increase the Stack Space to about 1
  382. # Meg.  This is probably bigger than most users want... 
  383. # 8.2.3 regexp reduced stack space requirements, but this should be
  384. # tested again
  385. test regexp-12.1 {Tcl_RegExpExec: large number of subexpressions} {macCrash} {
  386.     list [regexp (.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.) abcdefghijklmnopqrstuvwxyz all a b c d e f g h i j k l m n o p q r s t u v w x y z] $all $a $b $c $d $e $f $g $h $i $j $k $l $m $n $o $p $q $r $s $t $u $v $w $x $y $z
  387. } {1 abcdefghijklmnopqrstuvwxyz a b c d e f g h i j k l m n o p q r s t u v w x y z}
  388. test regexp-13.1 {regsub of a very large string} {
  389.     # This test is designed to stress the memory subsystem in order
  390.     # to catch Bug #933.  It only fails if the Tcl memory allocator
  391.     # is in use.
  392.     set line {BEGIN_TABLE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; END_TABLE}
  393.     set filedata [string repeat $line 200]
  394.     for {set i 1} {$i<10} {incr i} {
  395. regsub -all "BEGIN_TABLE " $filedata "" newfiledata
  396.     }
  397.     set x done
  398. } {done}
  399. test regexp-14.1 {CompileRegexp: regexp cache} {
  400.     regexp .*a b
  401.     regexp .*b c
  402.     regexp .*c d
  403.     regexp .*d e
  404.     regexp .*e f
  405.     set x .
  406.     append x *a
  407.     regexp $x bbba
  408. } 1
  409. test regexp-14.2 {CompileRegexp: regexp cache, different flags} {
  410.     regexp .*a b
  411.     regexp .*b c
  412.     regexp .*c d
  413.     regexp .*d e
  414.     regexp .*e f
  415.     set x .
  416.     append x *a
  417.     regexp -nocase $x bbba
  418. } 1
  419. testConstraint exec [llength [info commands exec]]
  420. test regexp-14.3 {CompileRegexp: regexp cache, empty regexp and empty cache} -constraints {
  421. exec
  422. } -setup {
  423.     set junk [makeFile {puts [regexp {} foo]} junk.tcl]
  424. } -body {
  425.     exec [interpreter] $junk
  426. } -cleanup {
  427.     removeFile junk.tcl
  428. } -result 1
  429. test regexp-15.1 {regexp -start} {
  430.     catch {unset x}
  431.     list [regexp -start -10 {d} 1abc2de3 x] $x
  432. } {1 1}
  433. test regexp-15.2 {regexp -start} {
  434.     catch {unset x}
  435.     list [regexp -start 2 {d} 1abc2de3 x] $x
  436. } {1 2}
  437. test regexp-15.3 {regexp -start} {
  438.     catch {unset x}
  439.     list [regexp -start 4 {d} 1abc2de3 x] $x
  440. } {1 2}
  441. test regexp-15.4 {regexp -start} {
  442.     catch {unset x}
  443.     list [regexp -start 5 {d} 1abc2de3 x] $x
  444. } {1 3}
  445. test regexp-15.5 {regexp -start, over end of string} {
  446.     catch {unset x}
  447.     list [regexp -start [string length 1abc2de3] {d} 1abc2de3 x] [info exists x]
  448. } {0 0}
  449. test regexp-15.6 {regexp -start, loss of ^$ behavior} {
  450.     list [regexp -start 2 {^$} {}]
  451. } {0}
  452. test regexp-16.1 {regsub -start} {
  453.     catch {unset x}
  454.     list [regsub -all -start 2 {d} a1b2c3d4e5 {/&} x] $x
  455. } {4 a1b/2c/3d/4e/5}
  456. test regexp-16.2 {regsub -start} {
  457.     catch {unset x}
  458.     list [regsub -all -start -25 {z} hello {/&} x] $x
  459. } {0 hello}
  460. test regexp-16.3 {regsub -start} {
  461.     catch {unset x}
  462.     list [regsub -all -start 3 {z} hello {/&} x] $x
  463. } {0 hello}
  464. test regexp-16.4 {regsub -start, A behavior} {
  465.     set out {}
  466.     lappend out [regsub -start 0 -all {A(w)} {abcde} {/1} x] $x
  467.     lappend out [regsub -start 2 -all {A(w)} {abcde} {/1} x] $x
  468. } {5 /a/b/c/d/e 3 ab/c/d/e}
  469. test regexp-17.1 {regexp -inline} {
  470.     regexp -inline b ababa
  471. } {b}
  472. test regexp-17.2 {regexp -inline} {
  473.     regexp -inline (b) ababa
  474. } {b b}
  475. test regexp-17.3 {regexp -inline -indices} {
  476.     regexp -inline -indices (b) ababa
  477. } {{1 1} {1 1}}
  478. test regexp-17.4 {regexp -inline} {
  479.     regexp -inline {w(d+)w} "   hello 23 there456def "
  480. } {e456d 456}
  481. test regexp-17.5 {regexp -inline no matches} {
  482.     regexp -inline {w(d+)w} ""
  483. } {}
  484. test regexp-17.6 {regexp -inline no matches} {
  485.     regexp -inline hello goodbye
  486. } {}
  487. test regexp-17.7 {regexp -inline, no matchvars allowed} {
  488.     list [catch {regexp -inline b abc match} msg] $msg
  489. } {1 {regexp match variables not allowed when using -inline}}
  490. test regexp-18.1 {regexp -all} {
  491.     regexp -all b bbbbb
  492. } {5}
  493. test regexp-18.2 {regexp -all} {
  494.     regexp -all b abababbabaaaaaaaaaab
  495. } {6}
  496. test regexp-18.3 {regexp -all -inline} {
  497.     regexp -all -inline b abababbabaaaaaaaaaab
  498. } {b b b b b b}
  499. test regexp-18.4 {regexp -all -inline} {
  500.     regexp -all -inline {w(w)} abcdefg
  501. } {ab b cd d ef f}
  502. test regexp-18.5 {regexp -all -inline} {
  503.     regexp -all -inline {w(w)$} abcdefg
  504. } {fg g}
  505. test regexp-18.6 {regexp -all -inline} {
  506.     regexp -all -inline {d+} 10:20:30:40
  507. } {10 20 30 40}
  508. test regexp-18.7 {regexp -all -inline} {
  509.     list [catch {regexp -all -inline b abc match} msg] $msg
  510. } {1 {regexp match variables not allowed when using -inline}}
  511. test regexp-18.8 {regexp -all} {
  512.     # This should not cause an infinite loop
  513.     regexp -all -inline {a*} a
  514. } {a}
  515. test regexp-18.9 {regexp -all} {
  516.     # Yes, the expected result is {a {}}.  Here's why:
  517.     # Start at index 0; a* matches the "a" there then stops.
  518.     # Go to index 1; a* matches the lambda (or {}) there then stops.  Recall
  519.     #   that a* matches zero or more "a"'s; thus it matches the string "b", as
  520.     #   there are zero or more "a"'s there.
  521.     # Go to index 2; this is past the end of the string, so stop.
  522.     regexp -all -inline {a*} ab
  523. } {a {}}
  524. test regexp-18.10 {regexp -all} {
  525.     # Yes, the expected result is {a {} a}.  Here's why:
  526.     # Start at index 0; a* matches the "a" there then stops.
  527.     # Go to index 1; a* matches the lambda (or {}) there then stops.   Recall
  528.     #   that a* matches zero or more "a"'s; thus it matches the string "b", as
  529.     #   there are zero or more "a"'s there.
  530.     # Go to index 2; a* matches the "a" there then stops.
  531.     # Go to index 3; this is past the end of the string, so stop.
  532.     regexp -all -inline {a*} aba
  533. } {a {} a}
  534. test regexp-18.11 {regexp -all} {
  535.     regexp -all -inline {^a} aaaa
  536. } {a}
  537. test regexp-18.12 {regexp -all -inline -indices} {
  538.     regexp -all -inline -indices a(b(c)d|e(f)g)h abcdhaefgh
  539. } {{0 4} {1 3} {2 2} {-1 -1} {5 9} {6 8} {-1 -1} {7 7}}
  540. test regexp-19.1 {regsub null replacement} {
  541.     regsub -all {@} {@hel@lo@} "a" result
  542.     list $result [string length $result]
  543. } "ahelaloa 14"
  544. test regexp-20.1 {regsub shared object shimmering} {
  545.     # Bug #461322
  546.     set a abcdefghijklmnopqurstuvwxyz 
  547.     set b $a 
  548.     set c abcdefghijklmnopqurstuvwxyz0123456789 
  549.     regsub $a $c $b d 
  550.     list $d [string length $d] [string bytelength $d]
  551. } [list abcdefghijklmnopqurstuvwxyz0123456789 37 37]
  552. test regexp-20.2 {regsub shared object shimmering with -about} {
  553.     eval regexp -about abc
  554. } {0 {}}
  555. test regexp-21.1 {regsub works with empty string} {
  556.     regsub -- ^ {} foo
  557. } {foo}
  558. test regexp-21.2 {regsub works with empty string} {
  559.     regsub -- $ {} foo
  560. } {foo}
  561. test regexp-21.3 {regsub works with empty string offset} {
  562.     regsub -start 0 -- ^ {} foo
  563. } {foo}
  564. test regexp-21.4 {regsub works with empty string offset} {
  565.     regsub -start 0 -- $ {} foo
  566. } {foo}
  567. test regexp-21.5 {regsub works with empty string offset} {
  568.     regsub -start 3 -- $ {123} foo
  569. } {123foo}
  570. test regexp-21.6 {regexp works with empty string} {
  571.     regexp -- ^ {}
  572. } {1}
  573. test regexp-21.7 {regexp works with empty string} {
  574.     regexp -start 0 -- ^ {}
  575. } {1}
  576. test regexp-21.8 {regexp works with empty string offset} {
  577.     regexp -start 3 -- ^ {123}
  578. } {0}
  579. test regexp-21.9 {regexp works with empty string offset} {
  580.     regexp -start 3 -- $ {123}
  581. } {1}
  582. test regexp-21.10 {multiple matches handle newlines} {
  583.     regsub -all -lineanchor -- {^#[^n]*n} "#onen#twon#threen" foon
  584. } "foonfoonfoon"
  585. test regexp-21.11 {multiple matches handle newlines} {
  586.     regsub -all -line -- ^ "anbnc" #
  587. } "#an#bn#c"
  588. test regexp-21.12 {multiple matches handle newlines} {
  589.     regsub -all -line -- ^ "nn" #
  590. } "#n#n#"
  591. test regexp-21.13 {multiple matches handle newlines} {
  592.     regexp -all -inline -indices -line -- ^ "anbnc"
  593. } {{0 -1} {2 1} {4 3}}
  594. test regexp-22.1 {Bug 1810038} {
  595.     regexp ($|^X)* {}
  596. } 1
  597. # cleanup
  598. ::tcltest::cleanupTests
  599. return