《JavaScript正则表达式迷你书》读书笔记

正则基础

常见简写形式

字符组 具体含义 记忆方式
d 表示 [0-9]。表示是一位数字。 其英文是 digit(数字)
D 表示 1。表示除数字外的任意字符。
w 表示 [0-9a-zA-Z_]。表示数字、大小写字母和下划线。 w 是 word 的简写,也称单词字符。
W 表示 2。非单词字符。
s 表示 [ tvnrf]。表示空白符,包括空格、水平制表符、垂直制表符、换行符、回车符、换页 符。 s 是 space 的首字母,空白符的单词是 white space。
S 表示 3。 非空白符。
. 表示 4。通配符,表示几乎任意字符。换行符、回车符、行分隔符和段分隔符 除外。 想想省略号 ... 中的每个点,都可以理解成占位符,表示任何类似的东西。
[dD]/[wW]/[sS]/[^] 任意字符

量词

字符组 具体含义 记忆方式
{m, } 至少出现m次
{m} 等价于{m, m}, 出现m次
? 等价于{0, 1}, 出现或者不出现 问号的意思: 有么?
+ 等价于{1, }, 表示至少出现一次 加号是追加的意思,表示必须现有一个,然后才考虑追加
* 等价于{0, }, 出现任意次, 有可能不出现 看看天上的星星,可能一颗没有,可能零散有几颗,可能数也数不过来

修饰符

字符组 具体含义 记忆方式
g 匹配全局 单词是global
i 忽略字母大小写 单词是ignoreCase
m 多行匹配, 只影响 ^ 和 $,二者变成行的概念,即行开头和行结尾 单词是multiline

匹配位置

字符组 具体含义 记忆方式
^ (脱字符)匹配开头
$ (美元符号)匹配结尾
b 单词边界 w 与 W 之间的位置,也包括 w 与 ^ 之间的位置,和 w 与 $ 之间的位置
B 非单词边界
(?=p) "p"的子模式, "p" 前面的位置 positive lookahead(正向先行断言)
(?!p) 非"p"前的位置 negative lookahead(负向先行断言)

匹配开头与结尾

  • /^|$/g: 匹配列
  • /^|$/gm: 匹配行, m是既有修饰符

ES5之后版本支持的位置判断

  • (?<=p): positive lookbehind(正向后行断言)
  • (?: negative lookbehind(负向后行断言)

举例

  • 千分位

    • 千分位示例1234567890

      • 三位数字的前面: /(?=\d{3}$)/g

        • (?=p): 正向先行断言
      • 多个三位数字: /(?=(\d{3})+$)/g

        • +: 量词, 多个
      • 最前面不匹配: /(?!^)(?=(\d{3})+$)/g

        • (?!^): 负向先行断言
      • 非捕获:

        • 正则: /\B(?=(?:\d{3})+(?!\d))/g

          • 千位分隔符的理解
    • 带空格的千分位123456789 123456789

      • /(?!\b)(?=(\d{3})+\b)/g,即/(\B)(?=(\d{3})+\b)/g
      • ^$要替换成\b
    • 格式化千分位

      function format (num) {
        return num.toFixed(2).replace(/\B(?=(\d{3})+\b)/g, ",").replace(/^/, "$$ ");
      };
      console.log( format(1888) );
      // => "$ 1,888.00"
  • 验证密码: 长度为6~12位, 由数字、大写字母和小写字母,必须至少包含两种字符

    • 长度为6~12位的数字、大小写字母: /^[0-9a-zA-Z]{6, 12}$/
    • 至少包含两种

      • 解题核心

        • 至少包含一位数字字符: /(?=.*[0-9])/
      • 划分情况

        • 包含数字和大写字母
        • 包含数字和小写字母
        • 包含大写字母和小写字母
        • 包含数字、大写字母和小写字母
      • 正则: /((?=.*[0-9])(?=.*[a-z])|(?=.*[0-9])(?=.*[A-Z])|(?=.*[a-z])(?=.*[A-Z]))^[0-9a-zA-Z]{6,12}$/

        • 注意: {6,12}中间不能有空格
    • 不能同时全部为一种(反向思路)

      • 解题核心

        • 不能全部为一种字符(数字): /(?!^[0-9]{6,12}$)(^[0-9a-zA-Z]{6,12})/
      • 划分情况

        • 不能全为数字
        • 不能全为大写字母
        • 不能全为小写字母
      • 正则: /(?!^[0-9]{6,12}$)(?!^[a-z]{6,12}$)(?!^[A-Z]{6,12}$)(^[0-9a-zA-Z]{6,12}$)/

常用正则

词法 含义 记忆方式
(?=.[A-Z]) / (?=.?[A-Z]) / (.*[A-Z]) 至少包含一个大写字母

括号的作用

分组和分支

  • 分组: 'ababa abbb ababab'.match(/(ab)+/g)
  • 分支: (p1|p2)

    • 示例

      var regex = /^I love (JavaScript|Regular Expression)$/
      console.log(regex.test("I love JavaScript")) // true
      console.log(regex.test("I love Regular Expression")) // true

分组引用: 正则引擎给分组开辟了一个空间, 用来存储每个分组匹配到的数据

  • 分组方法

    • 之前: /^d{4}-d{2}-d{2}$/
    • 之后: /^(d{4})-(d{2})-(d{2})$/
  • 提取数据:

    • match方法

      • 使用: '2017-06-12'.match(/(\d{4})-(\d{2})-(\d{2})/)
      • match返回数组: ["2017-06-12", "2017", "06", "12", index: 0, input: "2017-06-12", groups: undefined]

        • 第一个是整体匹配结果
        • 然后是各个分组匹配到的结果
        • 匹配下标
        • 输入的文本
        • 一个捕获组数组 或 undefined(如果没有定义命名捕获组)
      • 注意:

        • 使用g之后, 返回的是一个数组

          • 举例: '1s1'.match(/\d/g) => ["1", "1"]
        • 匹配不到, 则返回null
    • exec方法

      • 使用: /(\d{4})-(\d{2})-(\d{2})/.exec('2017-06-12')
    • 正常操作(test/match/exec)之后, 可以通过RegExp$0~$9获取
  • 替换: 转换yyyy-mm-dddd/mm/yyyy

    • $方法

      '2019-09-23'.replace(/(\d{4})-(\d{2})-(\d{2})/, '$2/$3/$1')
    • RegExp.$+function方法

      '2019-09-23'.replace(/(\d{4})-(\d{2})-(\d{2})/, function() {
          return `${RegExp.$2}/${RegExp.$3}/${RegExp.$1}`
      })
    • function方法

      '2019-09-23'.replace(/(\d{4})-(\d{2})-(\d{2})/, function(match, year, month, day) {
          return `${month}/${day}/${year}`
      })

反向引用: \1

  • 同时匹配日期格式: 2019-09-24, 2019/09/24, 2019.09.24

    • 正则: /\d{4}(-|\/|\.)\d{2}(-|\/|\.)\d{2}/
    • 问题: 格式不统一, 2019/09-24同样能匹配
    • 解决方法: 使用反向引用

      • 正则: /\d{4}(-|\/|\.)\d{2}(\1)\d{2}/
    • 同理: \2是第二个分组引用, 依次类推
  • 括号嵌套

    • 正则

      // ["1231231233", "123", "1", "23", "3", index: 0, input: "1231231233", groups: undefined]
      1231231233'.match(/^((\d)(\d(\d)))\1\2\3\4$/) 
    • 拆分

      • /^((\d)(\d(\d)))$/.test('123') // true
      • /^(\d)$/.test('1') // true
      • /^(\d(\d))$/.test('23') // true
      • /^(\d)$/.test('3') // true, 同第二个一样
  • 引用不存在的分组

    • 会匹配反向引用本身

      • 正则: /\1/.test('\1') // true
  • 分组后由量词

    • 会匹配到最后一次匹配

      • 正则: '12345'.match(/(\d)+/) // ["12345", "5", index: 0, input: "12345", groups: undefined]
      • 对于反向引用, 同理: /(\d)+ \1/.test('12345 5') // true

非捕获括号: (?:p)

非捕获匹配到的值不会保存起来
  • 与之相反的是

    • 捕获型分组
    • 捕获型分支
  • 举例

    'ababa abbb ababab'.match(/(?:ab)+/g) // ["abab", "ab", "ababab"]
    var regex = /^I love (?:JavaScript|Regular Expression)$/
    regex.test("I love JavaScript") // true
    regex.test("I love Regular Expression") // true

实战应用

trim: 去掉头部和尾部的空字符串

  • js: ' hello '.trim() // 'hello'
  • 正则:

    • 匹配到开头和结尾的空字符串, 替换掉(效率高)

      '  hello '.replace(/^\s+|\s+$/g, '')
    • 惰性匹配*?, 匹配所有字符串, 提取相应数据

      '  hello '.replace(/^\s*(.*?)\s*$/, '$1') // 'hello'

将每个单词的首字母转换为大写

  • 方法

    function titleize (str) {
        return str.toLowerCase().replace(/(?:^|\s)\w/g, function (c) {
            return c.toUpperCase();
        });
    }
    // My Name Is Epeli
    console.log( titleize('my name is epeli') )
  • 注意

    • \s: 制表符空格等, 用来匹配 name这样的数据

驼峰

  • 方法

    var camelize = function(str) {
        return str.replace(/[-_\s]+(.)?/g, function(match, c){
            return c ? c.toUpperCase() : ''
        })
    }
    console.log(camelize('-moz-transform'))
  • 注意

    • replace: 关于replace参数

      • match: 匹配到的字符串
      • p1,p2,...: 代表第n个括号匹配到的字符串
      • offset: 匹配到字符串在原字符串的偏移量
      • string: 被匹配的原字符串
      • NamedCaptureGroup: 命名捕获组匹配的对象
    • [-_\s]: 连字符、下划线和空白符
    • ?: 应对单词结尾不是单词字符, 例如'-moz-transform '

中划线化

  • 方法

    var dasherize = function(str) {
        return str.replace(/([A-Z])/g, '-$1').replace(/[-_\s]+/g, '-').toLowerCase()
    }
    console.log(dasherize('MozTTransform'))
  • 或者使用function

    var sperateLine = function(str) {
        return str.replace(/[A-Z]{1}/g, function(match) {
            return match ? `-${match.toLowerCase()}` : ''
        })
    }
    console.log(sperateLine('MozTTransform'))

HTML转义和反转义

  • 转义

    • 方法

      var escapeHTML = function(str) {
          var escapeChars = {
              '<': 'lt',
              '>': 'gt',
              '"': 'quot',
              '&': 'amp',
              '\'': '#39'
          }
          return str.replace(new RegExp(`[${Object.keys(escapeChars).join('')}]`, 'g'), function(match) {
              return `&${escapeChars[match]};`
          })
      }
      console.log(escapeHTML('
      hello, \'world\'
      '))
  • 反转义

    • 方法

      var unescapeHTML = function(str) {
          var htmlEntities = {
              'lt': '<',
              'gt': '>',
              'quot': '"',
              'amp': '&',
              '#39': '\''
          }
          return str.replace(new RegExp(`\&([^;]+);`, 'g'), function(match, key) {
              console.log(match, key)
              return (key in htmlEntities) ? htmlEntities[key] : match
          })
      }
      console.log(unescapeHTML('<div>hello, 'world'</div>'))
    • 注意

      • 关于/\&([^;]+);/g^

        • 匹配输入字符串开头位置
        • 方括号中使用, 表示不接受该字符集合
        • 匹配^本身,使用\^
        • 图示:
  • 成对标签

    • 简单匹配正则: /<([^>]+)>[\d\D]*<\/\1>/
    • 验证: /<([^>]+)>[\d\D]*<\/\1>/.test('wrong!</p>') // false</code> </li> </ul> </li> </ul> <h3>回溯法</h3> <ul> <li> <p>没有回溯的匹配</p> <ul> <li>举例: <code>/ab{1,3}c/.test('abbbc')</code> </li> </ul> </li> <li> <p>有回溯的匹配</p> <ul> <li>举例: <code>/ab{1,3}c/.test('abbc')</code> </li> </ul> </li> <li>回溯产生的原因: 一次没有恰好匹配, 需要多次匹配</li> <li> <p>建议: 应该避免</p> <ul> <li> <p>举例</p> <pre><code>// .*任意字符出现任意次, 会匹配到abc"de, 匹配完之后发现还有"正则, 然后会回溯,只匹配到abc /".*"/.test('"abc"de') // 更改建议, 匹配非"的字符任意次, 碰到"就终止匹配, 减少回溯, 提高效率 /"[^"]*"/.test('"abc"de')</code></pre> </li> </ul> </li> <li> <p>释义</p> <ul> <li> <p>百度百科</p> <blockquote> 回溯法也称试探法,它的基本思想是:从问题的某一种状态(初始状态)出发,搜索从这种状态出发 所能达到的所有“状态”,当一条路走到“尽头”的时候(不能再前进),再后退一步或若干步,从 另一种可能“状态”出发,继续搜索,直到所有的“路径”(状态)都试探过。这种不断“前进”、 不断“回溯”寻找解的方法,就称作“回溯法”。 </blockquote> </li> <li>本质: 深度优先搜索算法</li> <li>回溯: 退到之前的某一步的过程</li> </ul> </li> <li> <p>常见的回溯形式</p> <ul> <li> <p>贪婪量词</p> <ul> <li>尝试顺序从多往少的方向去尝试</li> <li> <p>举例</p> <pre><code>// ["12345", "123", "45", index: 0, input: "12345", groups: undefined] '12345'.match(/(\d{1,3})(\d{1,3})/)</code></pre> </li> </ul> </li> <li> <p>惰性量词</p> <ul> <li>贪婪量词后加问号尽可能少的匹配</li> <li> <p>举例</p> <pre><code>// ["1234", "1", "234", index: 0, input: "12345", groups: undefined] '12345'.match(/(\d{1,3}?)(\d{1,3})/)</code></pre> </li> <li> <p>会回溯的惰性</p> <pre><code>// ["12345", index: 0, input: "12345", groups: undefined] '12345'.match(/^\d{1,3}?\d{1,3}$/)</code></pre> </li> </ul> </li> <li> <p>分支结构</p> <ul> <li> <p>分支也是惰性匹配</p> <pre><code>// ["can", index: 0, input: "candy", groups: undefined] 'candy'.match(/can|candy/)</code></pre> </li> <li> <p>整体匹配的话,也会回溯</p> <pre><code>// ["candy", index: 0, input: "candy", groups: undefined] 'candy'.match(/^(?:can|candy)$/)</code></pre> </li> </ul> </li> <li> <p>总结</p> <ul> <li>回溯相对DFA引擎, 匹配效率低一些</li> <li> <p>概念</p> <ul> <li>DFA: 确定型有限自动机</li> <li> <p>NFA: 非确定型有限自动机</p> <ul> <li>JavaScript就是, 而且流行, 匹配慢(相对DFA)</li> <li>流行原因: 编译快, 有趣?</li> </ul> </li> </ul> </li> </ul> </li> </ul> </li> </ul> <h3>拆分</h3> <ul> <li> <p>结构的具体含义</p> <table> <thead> <tr> <th>结构</th> <th>说明</th> <th>举例</th> </tr> </thead> <tbody> <tr> <td>字面量</td> <td>匹配一个具体字符,包含需要转义和不需要转义的</td> <td>不转义: <code>/a/</code>匹配字符<code>'a'</code>; 转义: <code>/\n/</code>匹配换行符, <code>\.</code>匹配小数点</td> </tr> <tr> <td>字符组</td> <td>匹配一个字符,可以是多种可能之一;反义字符组,表示除特定字符的其他字符</td> <td> <code>/[0-9]/</code>表示匹配一个数字, 简写形式<code>/\d/</code>; <code>[^0-9]</code>表示匹配一个非数字, 简写形式<code>/\D/</code> </td> </tr> <tr> <td>量词</td> <td>表示一个字符连续出现; 或常见的简写形式</td> <td> <code>/a{1,3}/</code>表示<code>a</code>字符连续出现1~3次; <code>/a+/</code>表示<code>a</code>出现至少一次</td> </tr> <tr> <td>锚</td> <td>匹配一个位置, 而不是字符</td> <td> <code>^</code>表示匹配位置的开头, <code>\b</code>表示匹配单词边界, <code>(?=\d)</code>表示数字的前面</td> </tr> <tr> <td>分组</td> <td>用括号表示一个整体</td> <td> <code>(ab)+</code>表示<code>ab</code>两个字符连续出现多次, 也可以使用非捕获组<code>(?:ab)+</code> </td> </tr> <tr> <td>分支</td> <td>多个子表达式多选一, 反向引用</td> <td>`abc</td> <td>bcd<code>表示匹配</code>'abc'<code>或者</code>'bcd'<code>字符子串; </code>2`表示引用第2个分组</td> </tr> </tbody> </table> </li> <li> <p>操作符(从上至下)</p> <table> <thead> <tr> <th>操作符描述</th> <th>操作符</th> <th>优先级</th> </tr> </thead> <tbody> <tr> <td>转义符</td> <td><code>\</code></td> <td>1</td> </tr> <tr> <td>括号和方括号</td> <td> <code>(...)</code>、<code>(?:...)</code>、<code>(?=...)</code>、<code>(?!...)</code>、<code>[...]</code> </td> <td>2</td> </tr> <tr> <td>量词限定符</td> <td> <code>{m}</code>、<code>{m,n}</code>、<code>{m,}</code>、<code>?</code>、<code>*</code>、<code>+</code> </td> <td>3</td> </tr> <tr> <td>位置和序列</td> <td> <code>^</code>、<code>$</code>、<code>\元字符</code>、<code>一般字符</code> </td> <td>4</td> </tr> <tr> <td>管道符(竖杠)</td> <td>`</td> <td>`</td> <td>5</td> </tr> </tbody> </table> <ul> <li>举例: <code>/ab?(c|de*)+|fg/</code> </li> </ul> </li> <li> <p>注意</p> <ul> <li> <p>匹配字符串整体问题</p> <ul> <li>错误示例: <code>/^abc|bcd$/</code> </li> </ul> </li> </ul> </li> </ul> <pre><code> ![QQ20191010-145021.png](https://image-static.segmentfault.com/216/764/2167645415-5da548b931259_articlex) - 正确示例: `/^(abc|bcd)$/` ![QQ20191010-145048.png](https://image-static.segmentfault.com/757/272/757272158-5da548b9cd455_articlex) - 原因: 位置操作符优先级高于管道操作符 - 量词连缀问题 - 每个字符为`'a'`,`'b'`,`'c'`任选其一, 字符串长度是3的倍数 - 错误示例: `/^[abc]{3}+$/` > 会报错, 说`+`前没有什么可重复的 - 正确示例: `/([abc]{3})+/` ![QQ20191010-150526.png](https://image-static.segmentfault.com/207/251/2072516231-5da548ba4ba73_articlex) - 元字符转义问题 - 元字符 ``` /\^\$\.\*\+\?\|\\\/\[\]\{\}\=\!\:\-\,/.test('^$.*+?|\\/[]{}=!:-,') ``` - 字符串中, 每个字符转义之后还是本身 ``` // true '^$.*+?|\\/[]{}=!:-,' === '\^\$\.\*\+\?\|\\\/\[\]\{\}\=\!\:\-\,' ``` - 不是每个字符都需要转义 - 跟字符组有关的`[`、`]`、 `^`、 `-`。因此在会引起歧义的地方进行转义, 例如`^`, 否则会把整个字符组看成反义字符组 ``` '^$.*+?|\\/[]{}=!:-,'.match(/[\^$.*+?|\\/\[\]{}=!:\-,]/g) ``` - 匹配`'[abc]'`和`{3,5}` ``` /\[abc]/.test('[abc]') /\{3,5}/.test('{3,5}') /{,3}/.test('{,3}') ``` - 原因: *只需要在第一个方括号转义即可,因为后面的方括号构不成字符组,正则不会引发歧义,自然不需要转义* - 其他 - `=`, `!`, `:`, `-`, `,`不在特殊结构, 不需要转义 - 括号前后需要转义, `/\(123\)/` - `^`, `$`, `.`, `*`, `+`, `?`, `|`, `\`, `/`等字符, 只要不在字符组内, 都需要转义 - 案例分析 - 正则: `/^(\d{15}|\d{17}[\dxX])$/` - IPV4正则: `/^((0{0,2}\d|0?\d{2}|1\d{2}|2[0-4]\d|25[0-5])\.){3}(0{0,2}\d|0?\d{2}|1\d{2}|2[0-4]\d|25[0-5])$/` - 结构: `((...)\.){3}(...)` - 结构匹配: `3位数.3位数.3位数.3位数` - 拆分 - `0{0,2}\d`: 匹配 ``` 0~9 // 或 00~09 // 或 000~009 ``` - `0?\d{2}`: 匹配 ``` 10~99 // 或 010~099 ``` - `1\d{2}`: 匹配`100`~`199` - `2[0-4]\d`: 匹配`200`~`249` - `25[0-5]`: 匹配`250`~`255`</code></pre> <h3>正则表达式构建</h3> <ul> <li> <p>平衡法则</p> <ul> <li>匹配预期的字符串</li> <li>不匹配非预期的字符串</li> <li>可读性和可维护性</li> <li>效率</li> </ul> </li> <li> <p>构建正则前提</p> <ul> <li> <p>是否能使用正则</p> <ul> <li>举例: <code>'1010010001...'</code> </li> </ul> </li> <li> <p>是否有必要使用(复杂)正则</p> <ul> <li> <p>字符串分隔举例</p> <pre><code>var string = '2017-07-01' // 正则 var reg = /^(\d{4})-(\d{2})-(\d{2})/ console.log(string.match(reg)) // js api var stringArray = string.split('-') console.log(stringArray)</code></pre> </li> <li> <p>判断是否有问号</p> <pre><code>var string = '?id=xx&act=search' // 正则 console.log(string.search(/\?/)) // js api console.log(string.indexOf('?'))</code></pre> </li> <li> <p>获取子串</p> <pre><code>var string = 'JavaScript' // 正则 var reg = /.{4}(.+)/ console.log(string.match(reg)[1]) // js api console.log(string.substring(4))</code></pre> </li> <li> <p>是否有必要构建一个复杂的正则</p> <ul> <li>密码问题: 长度6~12位, 由数字、小写和大写字符组成, 必须包含两种字符</li> <li>复杂正则: <code>/(?!^[0-9]{6,12}$)(?!^[a-z]{6,12}$)(?!^[A-Z]{6,12}$)^[0-9A-Za-z]{6,12}$/</code> </li> <li> <p>分拆简单正则:</p> <pre><code>var regex1 = /^[0-9a-zA-Z]{6,12}$/ var regex2 = /^[0-9]$/ var regex3 = /^[a-z]$/ var regex4 = /^[A-Z]$/ function checkPassword = function(string) { if (!regex1.test(string) return false if (regex2.test(string)) return false if (regex3.test(string)) return false if (regex4.test(string)) return false return true }</code></pre> </li> </ul> </li> </ul> </li> </ul> </li> <li> <p>准确性</p> <ul> <li> <p>问题1:</p> <ul> <li>描述:匹配如下格式固话<code>055188888888</code>、<code>0551-88888888</code>、<code>(0551)88888888</code> </li> <li> <p>分析(不考虑分机号和<code>+86</code>)</p> <ul> <li>区号, 以0开头的3~4位数字, 正则: <code>/0\d{2,3}/</code> </li> <li>号码, 非0开头的6~7位数字, 正则: <code>/[1-9]\d{6,7}/</code> </li> <li>匹配<code>055188888888</code>, 正则: <code>/^0\d{2,3}[1-9]\d{6,7}$/</code> </li> <li>匹配<code>0551-88888888</code>, 正则: <code>/^0\d{2,3}-[1-9]\d{6,7}$/</code> </li> <li>匹配<code>(0551)88888888</code>, 正则: <code>/^\(0\d{2,3}\)[1-9]\d{6,7}$/</code> </li> <li>合并正则: <code>^/0\d{2,3}[1-9]\d{6,7}|0\d{2,3}-[1-9]\d{6,7}|\(0\d{2,3}\)[1-9]\d{6,7}$/</code> </li> <li>提取公共正则: <code>/^(0\d{2,3}|0\d{2,3}-|\(0\d{2,3}\))[1-9]\d{6,7}$/</code> </li> <li>进一步简写: <code>/^(0\d{2,3}-?|\(0\d{2,3}\))[1-9]\d{6,7}$/</code> </li> </ul> </li> </ul> </li> </ul> </li> </ul> <pre><code> ![QQ20191011-121606.png](https://image-static.segmentfault.com/365/885/3658857746-5da548bae93e5_articlex) - 测试 ``` /^(0\d{2,3}-?|\(0\d{2,3}\))[1-9]\d{6,7}$/.test('055188888888') /^(0\d{2,3}-?|\(0\d{2,3}\))[1-9]\d{6,7}$/.test('0551-88888888') /^(0\d{2,3}-?|\(0\d{2,3}\))[1-9]\d{6,7}$/.test('(0551)88888888') /^(0\d{2,3}-?|\(0\d{2,3}\))[1-9]\d{6,7}$/.test('051-8888888') ``` - 问题 - 3位和4位数字不一定是真实区号 - 问题2: - 描述: 匹配如下格式浮点数`1.23`、`+1.23`、`-1.23`、`10`、`+10`、`-10`、`.2`、`+.2`、`-.2` - 分析 - 符号部分: `[+-]` - 整数部分: `\d+` - 小数部分: `\.\d+` - 匹配`1.23`、`+1.23`、`-1.23`正则: `/^[+-]?\d+\.\d+$/` - 匹配`10`、`+10`、`-10`正则: `/^[+-]?\d+$/` - 匹配`.2`、`+.2`、`-.2`正则: `/^[+-]?\.\d+$/` - 合并正则: `/^[+-]?(\d+\.\d+|\d+|\.\d+)$/` ![float_1.png](https://image-static.segmentfault.com/386/026/3860260627-5da548bb9d7f5_articlex) - 另外一种写法: `/^[+-]?(\d+)?(\.)?\d+$/` > 涉及到可维护性和可读性 </code></pre> <ul> <li> <p>效率</p> <ul> <li> <p>正则运行阶段</p> <ul> <li> <p>编译</p> <blockquote> 引擎报错与否在这个阶段 </blockquote> </li> <li>设定起始位置</li> <li> <p>尝试匹配</p> <blockquote> 可以优化的阶段 </blockquote> </li> <li> <p>匹配失败,从下一位开始继续第3步</p> <blockquote> 可以优化的阶段 </blockquote> </li> <li>最终结果: 匹配成功或失败</li> </ul> </li> <li> <p>运行代码示例</p> <pre><code>var regex = /\d+/g; // 0 ["123", index: 0, input: "123abc34def", groups: undefined] console.log( regex.lastIndex, regex.exec("123abc34def") ); // 3 ["34", index: 6, input: "123abc34def", groups: undefined] console.log( regex.lastIndex, regex.exec("123abc34def") ); // 8 null console.log( regex.lastIndex, regex.exec("123abc34def") ); // 0 ["123", index: 0, input: "123abc34def", groups: undefined] console.log( regex.lastIndex, regex.exec("123abc34def") );</code></pre> <blockquote> 当使用 <code>test</code>和 <code>exec</code>时, 正则有 <code>g</code>时, 起始位置是从 <code>lastIndex</code>开始的 </blockquote> </li> <li> <p>优化方法</p> <ul> <li> <p>使用具体型字符组代替通配符, 来消除回溯</p> <ul> <li> <code>/".*"/.test('123"abc"456')</code>: 回溯有4次</li> <li> <p><code>/".*?"/.test('123"abc"456')</code>: 回溯有2次</p> <ul> <li>惰性匹配<code>*?</code> </li> </ul> </li> <li> <code>/"[^"]*"/.test('123"abc"456')</code>: 无回溯</li> </ul> </li> <li> <p>使用非捕获分组</p> <blockquote> 不需要使用分组引用和反向引用时 </blockquote> <ul> <li> <code>/^[+-]?(\d+\.\d+|\d+|\.\d+)$/</code>=><code>/^[+-]?(?:\d+\.\d+|\d+|\.\d+)$/</code> </li> </ul> </li> <li> <p>独立出确定字符</p> <ul> <li> <code>/a+/</code> => <code>/aa*/</code> </li> </ul> </li> <li> <p>提取公共分支部分</p> <blockquote> 可减少匹配过程中的重复 </blockquote> <ul> <li> <code>/^abc|^bcd/</code> => <code>/^(abc|bcd)/</code> </li> <li> <code>/this|that/</code> => <code>/th(?:is|at)/</code> </li> </ul> </li> <li> <p>减少分支的数量, 缩小它们范围</p> <ul> <li> <code>/red|read/</code> => <code>/rea?d/</code>: 可读性降低</li> </ul> </li> </ul> </li> <li> <p>总结</p> <ul> <li>关于准确性: 满足需求即可</li> <li>关于效率: 看个人要求</li> <li> <p>准确性思路</p> <ul> <li>针对每种情形, 分别写出正则</li> <li>再用分支进行合并</li> <li>提取公共部分</li> </ul> </li> </ul> </li> </ul> </li> </ul> <h3>正则表达式编程</h3> <ul> <li>匹配: 目标字符串中是否有匹配的子串</li> <li> <p>正则表达式的四种操作</p> <ul> <li> <p>验证: 判断是否的操作</p> <ul> <li> <p>search</p> <pre><code>// true !!~'abc123'.search(/\d/)</code></pre> </li> <li> <p>match</p> <pre><code>// true !!'abc123'.match(/\d/)</code></pre> </li> <li> <p>test</p> <pre><code>// true /\d/.test('abc123')</code></pre> </li> <li> <p>exec</p> <pre><code>// true !!/\d/.exec('abc123')</code></pre> </li> </ul> </li> <li> <p>切分:</p> <ul> <li> <p>切分<code>,</code>分隔的字符串</p> <pre><code>// ["html", "js", "css"] 'html,js,css'.split(/,/)</code></pre> </li> <li> <p>日期切割</p> <pre><code>// ["2019", "10", "11"] '2019/10/11'.split(/\D/) '2019.10.11'.split(/\D/) '2019-10-11'.split(/\D/)</code></pre> </li> </ul> </li> <li> <p>提取:</p> <ul> <li> <p>search</p> <pre><code>'2019-10-11'.search(/^(\d{4})\D(\d{2})\D(\d{2})$/) // 2019 10 11 console.log(RegExp.$1, RegExp.$2, RegExp.$3)</code></pre> </li> <li> <p>match</p> <pre><code>// ["2019-10-11", "2019", "10", "11", index: 0, input: "2019-10-11", groups: undefined] '2019-10-11'.match(/^(\d{4})\D(\d{2})\D(\d{2})$/)</code></pre> </li> <li> <p>replace</p> <pre><code>var date = [] '2019-10-11'.replace(/^(\d{4})\D(\d{2})\D(\d{2})$/, function(year, month, day) { date.push(year, month, day) }) // ["2019-10-11", "2019", "10"] console.log(date)</code></pre> </li> <li> <p>test</p> <pre><code>/^(\d{4})\D(\d{2})\D(\d{2})$/.test('2019-10-11') // 2019 10 11 console.log(RegExp.$1, RegExp.$2, RegExp.$3)</code></pre> </li> <li> <p>exec</p> <pre><code>/^(\d{4})\D(\d{2})\D(\d{2})$/.exec('2019-10-11') // 2019 10 11 console.log(RegExp.$1, RegExp.$2, RegExp.$3)</code></pre> </li> </ul> </li> <li> <p><em>替换</em>: 需要重点掌握</p> <pre><code>var tody = new Date('2019-10-11'.replace(/-/g, '/')) // Fri Oct 11 2019 00:00:00 GMT+0800 (China Standard Time) console.log(tody)</code></pre> </li> </ul> </li> <li> <p>相关API注意要点</p> <ul> <li> <p><code>search</code>和<code>match</code>会把字符串转成正则</p> <pre><code>// 0 '2019.10.11'.search('.') // ["2", index: 0, input: "2019.10.11", groups: undefined] '2019.10.11'.match('.') // 4 '2019.10.11'.search('\\.') // [".", index: 4, input: "2019.10.11", groups: undefined] '2019.10.11'.match('\\.') // 4 '2019.10.11'.search(/\./) // [".", index: 4, input: "2019.10.11", groups: undefined] '2019.10.11'.match(/\./) // "2019/10.11" '2019.10.11'.replace('.', '/')</code></pre> </li> <li> <p><code>match</code>返回的格式问题: 与是否有修饰符<code>g</code>有关</p> <pre><code>// ["2019", "2019", index: 0, input: "2019.10.11", groups: undefined] console.log('2019.10.11'.match(/\b(\d+)\b/)) // ["2019", "10", "11"] console.log('2019.10.11'.match(/\b(\d+)\b/g))</code></pre> </li> <li> <p><code>exec</code>比<code>match</code>更强大: <code>match</code>使用<code>g</code>之后, 没有关键信息<code>index</code>, <code>exec</code>可以解决这个问题, 并且接着上一次继续匹配</p> <pre><code>var string = "2019.10.11"; var regex2 = /\b(\d+)\b/g; // ["2019", "2019", index: 0, input: "2019.10.11", groups: undefined] console.log( regex2.exec(string) ); // 4 console.log( regex2.lastIndex); // ["10", "10", index: 5, input: "2019.10.11", groups: undefined] console.log( regex2.exec(string) ); // 7 console.log( regex2.lastIndex); // ["11", "11", index: 8, input: "2019.10.11", groups: undefined] console.log( regex2.exec(string) ); // 10 console.log( regex2.lastIndex); // null console.log( regex2.exec(string) ); // 0 console.log( regex2.lastIndex);</code></pre> <ul> <li> <p>对使用<code>exec</code>用法优化</p> <blockquote> 示例中 <code>lastIndex</code>表示下次匹配的开始位置 </blockquote> <pre><code>var string = '2019.10.11' var regex = /\b(\d+)\b/g var result while (result = regex.exec(string)) { console.log(result, regex.lastIndex) }</code></pre> </li> </ul> </li> <li> <p>修饰符<code>g</code>对<code>exec</code>和<code>test</code>的影响</p> <ul> <li> <p>字符串的四个方法, 每次匹配都是从0开始, 即<code>lastIndex</code>属性始终不变</p> <pre><code>var regex = /a/g 'a'.search(regex) // 0 console.log(regex.lastIndex) 'ab'.search(regex) // 0 console.log(regex.lastIndex)</code></pre> </li> <li> <p>正则的<code>exec</code>和<code>test</code>方法, 当正则含有<code>g</code>, 每次匹配都会更改<code>lastIndex</code>; 不含<code>g</code>, 则不会改变<code>lastIndex</code></p> <pre><code>var regex = /a/g // true 1 console.log( regex.test('a'), regex.lastIndex ) // true 3 console.log( regex.test('abac'), regex.lastIndex ) // false 0 console.log( regex.test('abacd'), regex.lastIndex )</code></pre> </li> </ul> </li> <li> <p><code>test</code>整体匹配时需要<code>^</code>和<code>$</code></p> <blockquote> <code>test</code>是看目标字符串中是否有子串符合条件 </blockquote> <pre><code>// true /123/.test('a123b') // false /^123$/.test('a123b') // true /^123$/.test('123')</code></pre> </li> </ul> </li> <li> <p><code>split</code>相关事项</p> <ul> <li> <p>有2个参数, 第2个表示数组最大长度</p> <pre><code>// ["js", "css"] 'js,css,html'.split(/,/, 2)</code></pre> </li> <li> <p>使用分组, 则结果包含分隔符本身</p> <pre><code>// ["js", ",", "css", ",", "html"] 'js,css,html'.split(/(,)/)</code></pre> </li> </ul> </li> <li> <p><code>replace</code>很强大</p> <ul> <li> <p>第二个参数是字符串时, 有如下含义</p> <table> <thead> <tr> <th>属性</th> <th>描述</th> </tr> </thead> <tbody> <tr> <td>$1,$2,...,$99</td> <td>匹配第1~99个分组里捕获到的文本</td> </tr> <tr> <td>$&</td> <td>匹配到的子串文本</td> </tr> <tr> <td>$`</td> <td>匹配到的子串左边的文本</td> </tr> <tr> <td>$'</td> <td>匹配到的子串右边的文本</td> </tr> <tr> <td>$$</td> <td>美元符号</td> </tr> </tbody> </table> <ul> <li> <p>把<code>2,3,5</code>变成<code>5=2+3</code></p> <pre><code>// "5=2+3" '2,3,5'.replace(/(\d+),(\d+),(\d+)/, '$3=$1+$2')</code></pre> </li> <li> <p>把<code>2,3,5</code>变成<code>222,333,555</code></p> <pre><code>'2,3,5'.replace(/(\d+)/g, '$&$&$&')</code></pre> </li> <li> <p>把<code>2+3=5</code>变成<code>2+3=2+3=5=5</code></p> <pre><code>// "2+3=2+3=5=5" '2+3=5'.replace(/(=)/, "$&$`$&$'$&")</code></pre> </li> </ul> </li> <li> <p>第二个参数是函数时</p> <blockquote> <code>replace</code>此时拿到的信息比 <code>exec</code>多 </blockquote> <pre><code>// ["1234", "1", "4", 0, "1234 2345 3456"] // ["2345", "2", "5", 5, "1234 2345 3456"] // ["3456", "3", "6", 10, "1234 2345 3456"] "1234 2345 3456".replace(/(\d)\d{2}(\d)/g, function (match, $1, $2, index, input) { // $1是每组数字的开始 // $2是每组数字的结束 console.log([match, $1, $2, index, input]); })</code></pre> </li> </ul> </li> <li> <p>使用构造函数需要注意的问题</p> <blockquote> 不推荐使用, 会写很多的 <code>\</code> </blockquote> <pre><code>// ["2017-06-27", "2017.06.27", "2017/06/27"] '2017-06-27 2017.06.27 2017/06/27'.match(/\d{4}(-|\.|\/)\d{2}\1\d{2}/g) // ["2017-06-27", "2017.06.27", "2017/06/27"] '2017-06-27 2017.06.27 2017/06/27'.match(new RegExp('\\d{4}(-|\\.|\\/)\\d{2}\\1\\d{2}', 'g'))</code></pre> </li> <li> <p>修饰符</p> <table> <thead> <tr> <th>修饰符</th> <th>描述</th> <th>单词</th> </tr> </thead> <tbody> <tr> <td>/g/</td> <td>全局匹配(找到所有的)</td> <td>global</td> </tr> <tr> <td>/i/</td> <td>忽略字母大小写</td> <td>ignoreCase</td> </tr> <tr> <td>/m/</td> <td>多行匹配, 只影响<code>^</code>和<code>$</code>, 二者变成行概念(行开头、行结尾)</td> <td>multiline</td> </tr> </tbody> </table> <ul> <li> <p>只读属性</p> <pre><code>var regex = /\w/img // true console.log(regex.global) // true console.log(regex.ignoreCase) // true console.log(regex.multiline)</code></pre> </li> </ul> </li> <li> <p><code>source</code>属性</p> <blockquote> 对象属性, 除了 <code>global</code>, <code>ignoreCase</code>, <code>multiline</code>, <code>lastIndex</code>还有 <code>source</code>属性; 用来构建动态正则, 或确认真正的正则 </blockquote> <pre><code>var className = "high"; // => (^|\s)high(\s|$) // => 即字符串"(^|\\s)high(\\s|$)" var regex = new RegExp("(^|\\s)" + className + "(\\s|$)"); console.log( regex.source ) console.log(regex.test(' high '), regex.test('high'))</code></pre> </li> <li> <p>构造函数属性</p> <blockquote> 静态属性随着最后一次正则操作而变化, 除了 <code>$1,...$9</code>, 还有几个不太常用的(有兼容问题) </blockquote> <table> <thead> <tr> <th>静态属性</th> <th>描述</th> <th>简写形式</th> </tr> </thead> <tbody> <tr> <td><code>RegExp.input</code></td> <td>最近一次目标字符串</td> <td>RegExp['$_']</td> </tr> <tr> <td><code>RegExp.lastMatch</code></td> <td>最近一次匹配的文本</td> <td>RegExp['$&']</td> </tr> <tr> <td><code>RegExp.lastParen</code></td> <td>最近一次捕获的文本</td> <td>RegExp['$+']</td> </tr> <tr> <td><code>RegExp.leftContext</code></td> <td>目标匹配lastMatch之前的文本</td> <td>RegExp['$`']</td> </tr> <tr> <td><code>RegExp.rightContext</code></td> <td>目标匹配lastMatch之后的文本</td> <td>RegExp["$'"]</td> </tr> </tbody> </table> <pre><code>var regex = /([abc])(\d)/g var string = 'a1b2c3d4e5' string.match(regex) // a1b2c3d4e5 a1b2c3d4e5 console.log(RegExp.input, RegExp['$_']) // c3 c3 console.log(RegExp.lastMatch, RegExp['$&']) // 3 3 console.log(RegExp.lastParen, RegExp['$+']) // a1b2 c3 console.log(RegExp.leftContext, RegExp['$&']) // d4e5 d4e5 console.log(RegExp.rightContext, RegExp["$'"])</code></pre> </li> </ul> <h3>真实案例</h3> <ul> <li> <p>构造函数生成正则: 通过class获取dom</p> <pre><code>function getClassByName(className) { var elements = document.getElementByTagName('*') var regex = new RegExp('(^|\\s)' + className + '($|\\s)') var result = [] var elementsLength = elements.length for (var i = 0; i < elementsLength; i++) { var element = elements[i] if (regex.test(element.className)) { result.push(element) } } return result }</code></pre> </li> <li> <p>字符串保存数据: 判断数据类型</p> <pre><code>var utils = {} 'Boolean|Number|String|Function|Array|Date|RegExp|Object|Error'.split('|').forEach(function(item) { utils['is' + item] = function(obj) { return {}.toString.call(obj) === '[object '+ item +']' } }) console.log(utils.isArray([1, 2, 3]))</code></pre> </li> <li> <p>正则替代 &&(不兼容IE)</p> <pre><code>var readyRegex = /complete|loaded|interactive/ function ready(callback) { if (readyRegex.test(document.readyState) && document.body) { callback() } else { document.addEventListener('DomContentLoaded', function() { callback() }, false) } }</code></pre> </li> <li> <p>强大的replace: 参数查询压缩</p> <pre><code>function compress(source) { var keys = {} // [^=&]中的&不能去掉, 否则第二次会匹配成&b=2 // key不能为空, value有可能为空, 所以第一次是+, 第二次是* source.replace(/([^=&]+)=([^&])*/g, function(full, key, value) { keys[key] = (keys[key] ? keys[key] + ',' : '') + value }) var result = [] for (var key in keys) { result.push(key + '=' + keys[key]) } return result.join('&') } // a=1,3&b=2,4 console.log(compress('a=1&b=2&a=3&b=4'))</code></pre> </li> <li> <p>根据字符串生成正则</p> <pre><code>function createRegex(regex) { try { if (regex[0] === '/') { regex = regex.split('/') regex.shift() var flags = regex.pop() regex = regex.join('/') regex = new RegExp(regex, flags) } else { regex = new RegExp(regex, 'g') } return { success: true, result: regex } } catch (e) { return { success: false, message: '无效的正则表达式' } } } // {success: true, result: /\d/gm} console.log(createRegex('/\\d/gm')) // {success: true, result: /\d/g} console.log(createRegex('/\\d/g'))</code></pre> </li> </ul> <h2>参考资料</h2> <ul> <li> <p>教程类</p> <ul> <li> <p>《JavaScript 正则表达式迷你书》</p> <ul> <li>JS正则表达式完整教程-老姚</li> </ul> </li> <li>这次不会说我的正则教程没写全了吧??</li> </ul> </li> <li> <p>文档类</p> <ul> <li>正则表达式简明参考</li> <li>正则表达式</li> <li>不包含某个字符</li> <li>至少包含某个字符</li> <li>最全的常用正则表达式大全——包括校验数字、字符、一些特殊的需求等等</li> </ul> </li> <li> <p>实用?</p> <ul> <li> <p>网址校验</p> <ul> <li>验证类</li> <li>JavaScript正则编写-原理篇</li> </ul> </li> </ul> </li> <li> <p>工具</p> <ul> <li> regexper: 正则可视化网站</li> </ul> </li> </ul> <hr> <ol> <li id="fn-1">0-9 ↩ </li> <li id="fn-2">0-9a-zA-Z_ ↩ </li> <li id="fn-3"> tvnrf ↩ </li> <li id="fn-4">nru2028u2029 ↩ </li> </ol> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1184018039599898624"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(javascript)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1835509897106649088.htm" title="Long类型前后端数据不一致" target="_blank">Long类型前后端数据不一致</a> <span class="text-muted">igotyback</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>响应给前端的数据浏览器控制台中response中看到的Long类型的数据是正常的到前端数据不一致前后端数据类型不匹配是一个常见问题,尤其是当后端使用Java的Long类型(64位)与前端JavaScript的Number类型(最大安全整数为2^53-1,即16位)进行数据交互时,很容易出现精度丢失的问题。这是因为JavaScript中的Number类型无法安全地表示超过16位的整数。为了解决这个问</div> </li> <li><a href="/article/1835498925755297792.htm" title="DIV+CSS+JavaScript技术制作网页(旅游主题网页设计与制作)云南大理" target="_blank">DIV+CSS+JavaScript技术制作网页(旅游主题网页设计与制作)云南大理</a> <span class="text-muted">STU学生网页设计</span> <a class="tag" taget="_blank" href="/search/%E7%BD%91%E9%A1%B5%E8%AE%BE%E8%AE%A1/1.htm">网页设计</a><a class="tag" taget="_blank" href="/search/%E6%9C%9F%E6%9C%AB%E7%BD%91%E9%A1%B5%E4%BD%9C%E4%B8%9A/1.htm">期末网页作业</a><a class="tag" taget="_blank" href="/search/html%E9%9D%99%E6%80%81%E7%BD%91%E9%A1%B5/1.htm">html静态网页</a><a class="tag" taget="_blank" href="/search/html5%E6%9C%9F%E6%9C%AB%E5%A4%A7%E4%BD%9C%E4%B8%9A/1.htm">html5期末大作业</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E9%A1%B5%E8%AE%BE%E8%AE%A1/1.htm">网页设计</a><a class="tag" taget="_blank" href="/search/web%E5%A4%A7%E4%BD%9C%E4%B8%9A/1.htm">web大作业</a> <div>️精彩专栏推荐作者主页:【进入主页—获取更多源码】web前端期末大作业:【HTML5网页期末作业(1000套)】程序员有趣的告白方式:【HTML七夕情人节表白网页制作(110套)】文章目录二、网站介绍三、网站效果▶️1.视频演示2.图片演示四、网站代码HTML结构代码CSS样式代码五、更多源码二、网站介绍网站布局方面:计划采用目前主流的、能兼容各大主流浏览器、显示效果稳定的浮动网页布局结构。网站程</div> </li> <li><a href="/article/1835496149843275776.htm" title="关于城市旅游的HTML网页设计——(旅游风景云南 5页)HTML+CSS+JavaScript" target="_blank">关于城市旅游的HTML网页设计——(旅游风景云南 5页)HTML+CSS+JavaScript</a> <span class="text-muted">二挡起步</span> <a class="tag" taget="_blank" href="/search/web%E5%89%8D%E7%AB%AF%E6%9C%9F%E6%9C%AB%E5%A4%A7%E4%BD%9C%E4%B8%9A/1.htm">web前端期末大作业</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/%E6%97%85%E6%B8%B8/1.htm">旅游</a><a class="tag" taget="_blank" href="/search/%E9%A3%8E%E6%99%AF/1.htm">风景</a> <div>⛵源码获取文末联系✈Web前端开发技术描述网页设计题材,DIV+CSS布局制作,HTML+CSS网页设计期末课程大作业|游景点介绍|旅游风景区|家乡介绍|等网站的设计与制作|HTML期末大学生网页设计作业,Web大学生网页HTML:结构CSS:样式在操作方面上运用了html5和css3,采用了div+css结构、表单、超链接、浮动、绝对定位、相对定位、字体样式、引用视频等基础知识JavaScrip</div> </li> <li><a href="/article/1835496148601761792.htm" title="HTML网页设计制作大作业(div+css) 云南我的家乡旅游景点 带文字滚动" target="_blank">HTML网页设计制作大作业(div+css) 云南我的家乡旅游景点 带文字滚动</a> <span class="text-muted">二挡起步</span> <a class="tag" taget="_blank" href="/search/web%E5%89%8D%E7%AB%AF%E6%9C%9F%E6%9C%AB%E5%A4%A7%E4%BD%9C%E4%B8%9A/1.htm">web前端期末大作业</a><a class="tag" taget="_blank" href="/search/web%E8%AE%BE%E8%AE%A1%E7%BD%91%E9%A1%B5%E8%A7%84%E5%88%92%E4%B8%8E%E8%AE%BE%E8%AE%A1/1.htm">web设计网页规划与设计</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/dreamweaver/1.htm">dreamweaver</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>Web前端开发技术描述网页设计题材,DIV+CSS布局制作,HTML+CSS网页设计期末课程大作业游景点介绍|旅游风景区|家乡介绍|等网站的设计与制作HTML期末大学生网页设计作业HTML:结构CSS:样式在操作方面上运用了html5和css3,采用了div+css结构、表单、超链接、浮动、绝对定位、相对定位、字体样式、引用视频等基础知识JavaScript:做与用户的交互行为文章目录前端学习路线</div> </li> <li><a href="/article/1835492740536823808.htm" title="node.js学习" target="_blank">node.js学习</a> <span class="text-muted">小猿L</span> <a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/vim/1.htm">vim</a> <div>node.js学习实操及笔记温故node.js,node.js学习实操过程及笔记~node.js学习视频node.js官网node.js中文网实操笔记githubcsdn笔记为什么学node.js可以让别人访问我们编写的网页为后续的框架学习打下基础,三大框架vuereactangular离不开node.jsnode.js是什么官网:node.js是一个开源的、跨平台的运行JavaScript的运行</div> </li> <li><a href="/article/1835448239864770560.htm" title="JavaScript 中,深拷贝(Deep Copy)和浅拷贝(Shallow Copy)" target="_blank">JavaScript 中,深拷贝(Deep Copy)和浅拷贝(Shallow Copy)</a> <span class="text-muted">跳房子的前端</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95/1.htm">前端面试</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/ecmascript/1.htm">ecmascript</a> <div>在JavaScript中,深拷贝(DeepCopy)和浅拷贝(ShallowCopy)是用于复制对象或数组的两种不同方法。了解它们的区别和应用场景对于避免潜在的bugs和高效地处理数据非常重要。以下是对深拷贝和浅拷贝的详细解释,包括它们的概念、用途、优缺点以及实现方式。1.浅拷贝(ShallowCopy)概念定义:浅拷贝是指创建一个新的对象或数组,其中包含了原对象或数组的基本数据类型的值和对引用数</div> </li> <li><a href="/article/1835428948339683328.htm" title="JavaScript `Map` 和 `WeakMap`详细解释" target="_blank">JavaScript `Map` 和 `WeakMap`详细解释</a> <span class="text-muted">跳房子的前端</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/%E5%8E%9F%E7%94%9F%E6%96%B9%E6%B3%95/1.htm">原生方法</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>在JavaScript中,Map和WeakMap都是用于存储键值对的数据结构,但它们有一些关键的不同之处。MapMap是一种可以存储任意类型的键值对的集合。它保持了键值对的插入顺序,并且可以通过键快速查找对应的值。Map提供了一些非常有用的方法和属性来操作这些数据对:set(key,value):将一个键值对添加到Map中。如果键已经存在,则更新其对应的值。get(key):获取指定键的值。如果键</div> </li> <li><a href="/article/1835419870070665216.htm" title="切换淘宝最新npm镜像源是" target="_blank">切换淘宝最新npm镜像源是</a> <span class="text-muted">hai40587</span> <a class="tag" taget="_blank" href="/search/npm/1.htm">npm</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a> <div>切换淘宝最新npm镜像源是一个相对简单的过程,但首先需要明确当前淘宝npm镜像源的状态和最新的镜像地址。由于网络环境和服务更新,镜像源的具体地址可能会发生变化,因此,我将基于当前可获取的信息,提供一个通用的切换步骤,并附上最新的镜像地址(截至回答时)。一、了解npm镜像源npm(NodePackageManager)是JavaScript的包管理器,用于安装、更新和管理项目依赖。由于npm官方仓库</div> </li> <li><a href="/article/1835383919906746368.htm" title="高性能javascript--算法和流程控制" target="_blank">高性能javascript--算法和流程控制</a> <span class="text-muted">海淀萌狗</span> <div>-for,while和do-while性能相当-避免使用for-in循环,==除非遍历一个属性量未知的对象==es5:for-in遍历的对象便不局限于数组,还可以遍历对象。原因:for-in每次迭代操作会同时搜索实例或者原型属性,for-in循环的每次迭代都会产生更多开销,因此要比其他循环类型慢,一般速度为其他类型循环的1/7。因此,除非明确需要迭代一个属性数量未知的对象,否则应避免使用for-i</div> </li> <li><a href="/article/1835373236217540608.htm" title="360前端星计划-动画可以这么玩" target="_blank">360前端星计划-动画可以这么玩</a> <span class="text-muted">马小蜗</span> <div>动画的基本原理定时器改变对象的属性根据新的属性重新渲染动画functionupdate(context){//更新属性}constticker=newTicker();ticker.tick(update,context);动画的种类1、JavaScript动画操作DOMCanvas2、CSS动画transitionanimation3、SVG动画SMILJS动画的优缺点优点:灵活度、可控性、性能</div> </li> <li><a href="/article/1835360244646113280.htm" title="JavaScript中秋快乐!" target="_blank">JavaScript中秋快乐!</a> <span class="text-muted">Q_w7742</span> <a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/ecmascript/1.htm">ecmascript</a> <div>我们来实现一个简单的祝福网页~主要的难度在于使用canvas绘图当点击canvas时候,跳出“中秋节快乐”字样,需要注册鼠标单击事件和计时器。首先定义主要函数:初始化当点击canvas之后转到onCanvasClick函数,绘图生成灯笼。functiononCanvasClick(){//事件处理函数context.clearRect(0,0,canvas1.width,canvas1.heigh</div> </li> <li><a href="/article/1835359727924637696.htm" title="Nginx从入门到实践(三)" target="_blank">Nginx从入门到实践(三)</a> <span class="text-muted">听你讲故事啊</span> <div>动静分离动静分离是将网站静态资源(JavaScript,CSS,img等文件)与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用访问。动静分离的一种做法是将静态资源部署在nginx上,后台项目部署到应用服务器上,根据一定规则静态资源的请求全部请求nginx服务器,达到动静分离的目标。rewrite规则Rewrite规则常见正则表达式Rewrite主要的功能就是实现URL的重写,Ngin</div> </li> <li><a href="/article/1835354700392787968.htm" title="Nginx的使用场景:构建高效、可扩展的Web架构" target="_blank">Nginx的使用场景:构建高效、可扩展的Web架构</a> <span class="text-muted">张某布响丸辣</span> <a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a> <div>Nginx,作为当今最流行的Web服务器和反向代理软件之一,凭借其高性能、稳定性和灵活性,在众多Web项目中扮演着核心角色。无论是个人博客、中小型网站,还是大型企业级应用,Nginx都能提供强大的支持。本文将探讨Nginx的几个主要使用场景,帮助读者理解如何在实际项目中充分利用Nginx的优势。1.静态文件服务对于包含大量静态文件(如HTML、CSS、JavaScript、图片等)的网站,Ngin</div> </li> <li><a href="/article/1835354447627251712.htm" title="前端知识点" target="_blank">前端知识点</a> <span class="text-muted">ZhangTao_zata</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a> <div>下面是一个最基本的html代码body{font-family:Arial,sans-serif;margin:20px;}//JavaScriptfunctionthatdisplaysanalertwhencalledfunctionshowMessage(){alert("Hello!Youclickedthebutton.");}MyFirstHTMLPageWelcometoMyPage</div> </li> <li><a href="/article/1835331376895848448.htm" title="【JS】前端文件读取FileReader操作总结" target="_blank">【JS】前端文件读取FileReader操作总结</a> <span class="text-muted">程序员-张师傅</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>前端文件读取FileReader操作总结FileReader是JavaScript中的一个WebAPI,它允许web应用程序异步读取用户计算机上的文件(或原始数据缓冲区)的内容,例如读取文件以获取其内容,并在不将文件发送到服务器的情况下在客户端使用它。这对于处理图片、文本文件等非常有用,尤其是当你想要在用户界面中即时显示文件内容或进行文件预览时。创建FileReader对象首先,你需要创建一个Fi</div> </li> <li><a href="/article/1835298981362626560.htm" title="webstorm报错TypeError: this.cliEngine is not a constructor" target="_blank">webstorm报错TypeError: this.cliEngine is not a constructor</a> <span class="text-muted">Blue_Color</span> <div>点击Details在控制台会显示报错的位置TypeError:this.cliEngineisnotaconstructoratESLintPlugin.invokeESLint(/Applications/RubyMine.app/Contents/plugins/JavaScriptLanguage/languageService/eslint/bin/eslint-plugin.js:97:</div> </li> <li><a href="/article/1835296397365178368.htm" title="创建一个完整的购物商城系统是一个复杂的项目,涉及前端(用户界面)、后端(服务器逻辑)、数据库等多个部分。由于篇幅限制,我无法在这里提供一个完整的系统代码,但我可以分别给出一些关键部分的示例代码,涵盖几" target="_blank">创建一个完整的购物商城系统是一个复杂的项目,涉及前端(用户界面)、后端(服务器逻辑)、数据库等多个部分。由于篇幅限制,我无法在这里提供一个完整的系统代码,但我可以分别给出一些关键部分的示例代码,涵盖几</a> <span class="text-muted">uthRaman</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/ui/1.htm">ui</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a> <div>前端(HTML/CSS/JavaScript)grsyzp.cnHTML页面结构(index.html)html购物商城欢迎来到购物商城JavaScript(Ajax请求商品数据,app.js)javascriptdocument.addEventListener('DOMContentLoaded',function(){fetch('/api/products').then(response=</div> </li> <li><a href="/article/1835293121953492992.htm" title="了解 UNPKG:前端开发者的包管理利器" target="_blank">了解 UNPKG:前端开发者的包管理利器</a> <span class="text-muted">小于负无穷</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/typescript/1.htm">typescript</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/html5/1.htm">html5</a><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a> <div>在现代前端开发中,JavaScript包管理和模块化是至关重要的,而npm则是最流行的JavaScript包管理器之一。不过,随着前端项目复杂性的增加,有时候我们希望快速引入外部依赖,而无需本地安装和构建。此时,CDN(内容分发网络)成为了一种方便快捷的解决方案,而UNPKG就是这种方式中的佼佼者。什么是UNPKG?UNPKG是一个基于npm的内容分发网络(CDN),它允许开发者直接通过URL从n</div> </li> <li><a href="/article/1835247344719851520.htm" title="2019-05-29 vue-router的两种模式的区别" target="_blank">2019-05-29 vue-router的两种模式的区别</a> <span class="text-muted">Kason晨</span> <div>1、大家都知道vue是一种单页应用,单页应用就是仅在页面初始化的时候加载相应的html/css/js一单页面加载完成,不会因为用户的操作而进行页面的重新加载或者跳转,用javascript动态的变化html的内容优点:良好的交互体验,用户不需要刷新页面,页面显示流畅,良好的前后端工作分离模式,减轻服务器压力,缺点:不利于SEO,初次加载耗时比较多2、hash模式vue-router默认的是hash</div> </li> <li><a href="/article/1835216109297561600.htm" title="electron多标签页模式更像客户端" target="_blank">electron多标签页模式更像客户端</a> <span class="text-muted">diygwcom</span> <a class="tag" taget="_blank" href="/search/electron/1.htm">electron</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>Electron多标签页模式是指在Electron框架中实现的类似Web浏览器的多标签页功能。Electron是一个使用Web技术(HTML、CSS和JavaScript)来创建跨平台桌面应用程序的框架。在Electron中实现多标签页模式,通常需要借助一些特定的库或组件,如BrowserView或electron-tabs,或者通过自定义实现。实现方式1.使用BrowserViewBrowser</div> </li> <li><a href="/article/1835194426499100672.htm" title="外卖霸王餐返利外卖会员卡小程序开发" target="_blank">外卖霸王餐返利外卖会员卡小程序开发</a> <span class="text-muted">闹小艾</span> <a class="tag" taget="_blank" href="/search/good506070/1.htm">good506070</a><a class="tag" taget="_blank" href="/search/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/1.htm">微信小程序</a><a class="tag" taget="_blank" href="/search/%E5%B0%8F%E7%A8%8B%E5%BA%8F/1.htm">小程序</a> <div>外卖霸王餐返利外卖会员卡小程序开发"社交电商赋能下的外卖返利小程序"是专为商家与用户双赢而设计的创新平台。以下是其开发方案的详细步骤:一、需求梳理:首先,我们需要明确小程序的核心功能和特色。包括设定活动类型、返利策略,以及用户体验友好的界面设计。二、技术决策:技术选型是关键。我们采用小程序的开发框架,利用JavaScript作为前端开发语言,并结合微信提供的API进行后端接口调用与数据处理。三、账</div> </li> <li><a href="/article/1835192531881652224.htm" title="Axure设计之全屏与退出全屏交互实现" target="_blank">Axure设计之全屏与退出全屏交互实现</a> <span class="text-muted">招风的黑耳</span> <a class="tag" taget="_blank" href="/search/Axure/1.htm">Axure</a><a class="tag" taget="_blank" href="/search/axure/1.htm">axure</a><a class="tag" taget="_blank" href="/search/%E4%BA%A4%E4%BA%92/1.htm">交互</a> <div>在AxureRP中,设计全屏与退出全屏的交互功能可以极大地提升用户体验,尤其是在展示产品原型或进行演示时。本文将详细介绍如何在AxureRP中通过结合JavaScript代码实现全屏与退出全屏的交互效果。Axure原型设计web端交互元件库:https://1zvcwx.axshare.com一、设计思路全屏与退出全屏的交互设计主要依赖于JavaScript代码来控制浏览器的全屏模式。在Axure</div> </li> <li><a href="/article/1835162742533746688.htm" title="全面指南:用户行为从前端数据采集到实时处理的最佳实践" target="_blank">全面指南:用户行为从前端数据采集到实时处理的最佳实践</a> <span class="text-muted">数字沉思</span> <a class="tag" taget="_blank" href="/search/%E8%90%A5%E9%94%80/1.htm">营销</a><a class="tag" taget="_blank" href="/search/%E6%B5%81%E9%87%8F%E8%BF%90%E8%90%A5/1.htm">流量运营</a><a class="tag" taget="_blank" href="/search/%E7%B3%BB%E7%BB%9F%E6%9E%B6%E6%9E%84/1.htm">系统架构</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E5%86%85%E5%AE%B9%E8%BF%90%E8%90%A5/1.htm">内容运营</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a> <div>引言在当今的数据驱动世界,实时数据采集和处理已经成为企业做出及时决策的重要手段。本文将详细介绍如何通过前端JavaScript代码采集用户行为数据、利用API和Kafka进行数据传输、通过Flink实时处理数据的完整流程。无论你是想提升产品体验还是做用户行为分析,这篇文章都将为你提供全面的解决方案。设计一个通用的ClickHouse表来存储用户事件时,需要考虑多种因素,包括事件类型、时间戳、用户信</div> </li> <li><a href="/article/1835154546289111040.htm" title="EcmaScript和JavaScript的区别" target="_blank">EcmaScript和JavaScript的区别</a> <span class="text-muted">每天吃八顿</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/ecmascript/1.htm">ecmascript</a> <div>ECMAScript和JavaScript是经常被混淆的两个术语,但实际上它们之间存在一些区别:ECMAScript:ECMAScript(通常缩写为ES,并且有版本号如ES5,ES6和ES7等)是由ECMA国际(EuropeanComputerManufacturersAssociation)制定的一种脚本语言的规范。这个规范定义了语法、命令、数据类型等基本元素。ECMAScript是一种规范,</div> </li> <li><a href="/article/1835137656992919552.htm" title="javascript添加p元素,html添加文字,appendChild" target="_blank">javascript添加p元素,html添加文字,appendChild</a> <span class="text-muted">游勇一</span> <a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/html%E6%B7%BB%E5%8A%A0p/1.htm">html添加p</a><a class="tag" taget="_blank" href="/search/appendChild/1.htm">appendChild</a> <div>javascript添加p元素,html添加文字,appendChild。网页添加p元素效果截图。个人签名:游志勇,预制板,南托岭预制场。文字展示#wordsadd{font-size:70px;word-break:break-all;}#wordsaddp{margin:002px0;padding:002px0;line-height:93%;}.btn_width{width:90px;}</div> </li> <li><a href="/article/1835136018660028416.htm" title="CesiumJS+SuperMap3D.js混用实现可视域分析 S3M图层加载 裁剪区域绘制" target="_blank">CesiumJS+SuperMap3D.js混用实现可视域分析 S3M图层加载 裁剪区域绘制</a> <span class="text-muted">SteveJi666</span> <a class="tag" taget="_blank" href="/search/WebGL/1.htm">WebGL</a><a class="tag" taget="_blank" href="/search/cesium/1.htm">cesium</a><a class="tag" taget="_blank" href="/search/EarthSDK/1.htm">EarthSDK</a><a class="tag" taget="_blank" href="/search/SuperMap/1.htm">SuperMap</a><a class="tag" taget="_blank" href="/search/3d/1.htm">3d</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/arcgis/1.htm">arcgis</a> <div>版本简介:cesium:1.99;Supermap3D:SuperMapiClientJavaScript11i(2023);官方下载文档链家:SuperMap技术资源中心|为您提供全面的在线技术服务示例参考:support.supermap.com.cn:8090/webgl/Cesium/examples/webgl/examples.html#analysissupport.supermap</div> </li> <li><a href="/article/1835131605585326080.htm" title="html打开本地excel文件夹,html使用excel表格数据库-html读取本地excel文件并展示" target="_blank">html打开本地excel文件夹,html使用excel表格数据库-html读取本地excel文件并展示</a> <span class="text-muted">睿理</span> <div>html表格如何导入到excel中在vs里面用添加数据源就可以啊,再使用数据控件,就可以操作.添加数据源可以用odbc数据源,两种方式1,是在控制面板的管理工具里在ODBC里先设置好.2,是使用连接字符串.用vs的添加数据源向导做.html中有没有类似excel表格,可以填数的表格控件?首先html不能读取本地excel文件其次就算是javascript也是不允许的这是为了安全考虑如果前端脚本可以</div> </li> <li><a href="/article/1835131225128398848.htm" title="如何在 Python 中声明一个静态属性?" target="_blank">如何在 Python 中声明一个静态属性?</a> <span class="text-muted">潮易</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>在Python中,静态属性的定义和使用方式与JavaScript中的类似,主要是通过`@staticmethod`装饰器来实现。静态属性不需要实例化对象就可以访问,它们属于类本身。###如何声明一个静态属性:1.首先,需要在属性名前添加`@staticmethod`装饰器。2.接下来,定义一个普通方法,该方法的第一个参数通常为`cls`(用于表示类的引用)。###代码示例:```pythoncla</div> </li> <li><a href="/article/1835125415920889856.htm" title="数据格式:什么是JSON和XML" target="_blank">数据格式:什么是JSON和XML</a> <span class="text-muted">isNotNullX</span> <a class="tag" taget="_blank" href="/search/json/1.htm">json</a><a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a> <div>JSON和XML都是数据交换的一种格式,用于在不同的系统和应用程序之间传输和存储数据。本文将解释JSON和XML的基础内容,并探讨两者的不同。一·什么是JSON?1.JSON(JavaScriptObjectNotation)即JavaScript对象标记法:-JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。-JSON基于JavaScript的一个子集,但JSON是</div> </li> <li><a href="/article/1835118231979913216.htm" title="HighCharts图表自动化简介" target="_blank">HighCharts图表自动化简介</a> <span class="text-muted">知识的宝藏</span> <a class="tag" taget="_blank" href="/search/Selenium%E9%AB%98%E7%BA%A7%E7%AF%87/1.htm">Selenium高级篇</a><a class="tag" taget="_blank" href="/search/Selenium%E5%9B%BE%E8%A1%A8%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/1.htm">Selenium图表自动化测试</a><a class="tag" taget="_blank" href="/search/highcharts%E5%9B%BE%E8%A1%A8%E8%87%AA%E5%8A%A8%E5%8C%96/1.htm">highcharts图表自动化</a><a class="tag" taget="_blank" href="/search/Selenium%E5%9B%BE%E8%A1%A8%E8%87%AA%E5%8A%A8%E5%8C%96/1.htm">Selenium图表自动化</a><a class="tag" taget="_blank" href="/search/%E5%9B%BE%E8%A1%A8%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/1.htm">图表自动化测试</a><a class="tag" taget="_blank" href="/search/highcharts/1.htm">highcharts</a><a class="tag" taget="_blank" href="/search/Selenium/1.htm">Selenium</a> <div>什么是分析数据?在任何应用程序中捕获并以图形或图表形式显示的分析数据是任何产品或系统的关键部分,因为它提供了对实时数据的洞察。验证此类分析数据非常重要,因为不准确的数据可能会在报告中产生问题,并可能影响应用程序/系统的其他相关领域。什么是HighChart?Highcharts是一个用纯JavaScript编写的j基于SVG成图技术的图表库,提供了一种简单的方法来向您的网站或Web应用程序添加交互</div> </li> <li><a href="/article/37.htm" title="ASM系列五 利用TreeApi 解析生成Class" target="_blank">ASM系列五 利用TreeApi 解析生成Class</a> <span class="text-muted">lijingyao8206</span> <a class="tag" taget="_blank" href="/search/ASM/1.htm">ASM</a><a class="tag" taget="_blank" href="/search/%E5%AD%97%E8%8A%82%E7%A0%81%E5%8A%A8%E6%80%81%E7%94%9F%E6%88%90/1.htm">字节码动态生成</a><a class="tag" taget="_blank" href="/search/ClassNode/1.htm">ClassNode</a><a class="tag" taget="_blank" href="/search/TreeAPI/1.htm">TreeAPI</a> <div>   前面CoreApi的介绍部分基本涵盖了ASMCore包下面的主要API及功能,其中还有一部分关于MetaData的解析和生成就不再赘述。这篇开始介绍ASM另一部分主要的Api。TreeApi。这一部分源码是关联的asm-tree-5.0.4的版本。          在介绍前,先要知道一点, Tree工程的接口基本可以完</div> </li> <li><a href="/article/164.htm" title="链表树——复合数据结构应用实例" target="_blank">链表树——复合数据结构应用实例</a> <span class="text-muted">bardo</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/%E6%A0%91%E5%9E%8B%E7%BB%93%E6%9E%84/1.htm">树型结构</a><a class="tag" taget="_blank" href="/search/%E8%A1%A8%E7%BB%93%E6%9E%84%E8%AE%BE%E8%AE%A1/1.htm">表结构设计</a><a class="tag" taget="_blank" href="/search/%E9%93%BE%E8%A1%A8/1.htm">链表</a><a class="tag" taget="_blank" href="/search/%E8%8F%9C%E5%8D%95%E6%8E%92%E5%BA%8F/1.htm">菜单排序</a> <div>我们清楚:数据库设计中,表结构设计的好坏,直接影响程序的复杂度。所以,本文就无限级分类(目录)树与链表的复合在表设计中的应用进行探讨。当然,什么是树,什么是链表,这里不作介绍。有兴趣可以去看相关的教材。 需求简介: 经常遇到这样的需求,我们希望能将保存在数据库中的树结构能够按确定的顺序读出来。比如,多级菜单、组织结构、商品分类。更具体的,我们希望某个二级菜单在这一级别中就是第一个。虽然它是最后</div> </li> <li><a href="/article/291.htm" title="为啥要用位运算代替取模呢" target="_blank">为啥要用位运算代替取模呢</a> <span class="text-muted">chenchao051</span> <a class="tag" taget="_blank" href="/search/%E4%BD%8D%E8%BF%90%E7%AE%97/1.htm">位运算</a><a class="tag" taget="_blank" href="/search/%E5%93%88%E5%B8%8C/1.htm">哈希</a><a class="tag" taget="_blank" href="/search/%E6%B1%87%E7%BC%96/1.htm">汇编</a> <div>    在hash中查找key的时候,经常会发现用&取代%,先看两段代码吧,     JDK6中的HashMap中的indexFor方法: /** * Returns index for hash code h. */ static int indexFor(int h, int length) { </div> </li> <li><a href="/article/418.htm" title="最近的情况" target="_blank">最近的情况</a> <span class="text-muted">麦田的设计者</span> <a class="tag" taget="_blank" href="/search/%E7%94%9F%E6%B4%BB/1.htm">生活</a><a class="tag" taget="_blank" href="/search/%E6%84%9F%E6%82%9F/1.htm">感悟</a><a class="tag" taget="_blank" href="/search/%E8%AE%A1%E5%88%92/1.htm">计划</a><a class="tag" taget="_blank" href="/search/%E8%BD%AF%E8%80%83/1.htm">软考</a><a class="tag" taget="_blank" href="/search/%E6%83%B3/1.htm">想</a> <div>      今天是2015年4月27号      整理一下最近的思绪以及要完成的任务             1、最近在驾校科目二练车,每周四天,练三周。其实做什么都要用心,追求合理的途径解决。为</div> </li> <li><a href="/article/545.htm" title="PHP去掉字符串中最后一个字符的方法" target="_blank">PHP去掉字符串中最后一个字符的方法</a> <span class="text-muted">IT独行者</span> <a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a><a class="tag" taget="_blank" href="/search/%E5%AD%97%E7%AC%A6%E4%B8%B2/1.htm">字符串</a> <div>今天在PHP项目开发中遇到一个需求,去掉字符串中的最后一个字符 原字符串1,2,3,4,5,6, 去掉最后一个字符",",最终结果为1,2,3,4,5,6 代码如下: $str = "1,2,3,4,5,6,"; $newstr = substr($str,0,strlen($str)-1); echo $newstr; </div> </li> <li><a href="/article/672.htm" title="hadoop在linux上单机安装过程" target="_blank">hadoop在linux上单机安装过程</a> <span class="text-muted">_wy_</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a> <div>1、安装JDK     jdk版本最好是1.6以上,可以使用执行命令java -version查看当前JAVA版本号,如果报命令不存在或版本比较低,则需要安装一个高版本的JDK,并在/etc/profile的文件末尾,根据本机JDK实际的安装位置加上以下几行:    export JAVA_HOME=/usr/java/jdk1.7.0_25  </div> </li> <li><a href="/article/799.htm" title="JAVA进阶----分布式事务的一种简单处理方法" target="_blank">JAVA进阶----分布式事务的一种简单处理方法</a> <span class="text-muted">无量</span> <a class="tag" taget="_blank" href="/search/%E5%A4%9A%E7%B3%BB%E7%BB%9F%E4%BA%A4%E4%BA%92/1.htm">多系统交互</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a><a class="tag" taget="_blank" href="/search/%E4%BA%8B%E5%8A%A1/1.htm">事务</a> <div>每个方法都是原子操作: 提供第三方服务的系统,要同时提供执行方法和对应的回滚方法 A系统调用B,C,D系统完成分布式事务 =========执行开始======== A.aa(); try { B.bb(); } catch(Exception e) { A.rollbackAa(); } try { C.cc(); } catch(Excep</div> </li> <li><a href="/article/926.htm" title="安墨移动广 告:移动DSP厚积薄发 引领未来广 告业发展命脉" target="_blank">安墨移动广 告:移动DSP厚积薄发 引领未来广 告业发展命脉</a> <span class="text-muted">矮蛋蛋</span> <a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a><a class="tag" taget="_blank" href="/search/%E4%BA%92%E8%81%94%E7%BD%91/1.htm">互联网</a> <div>  “谁掌握了强大的DSP技术,谁将引领未来的广 告行业发展命脉。”2014年,移动广 告行业的热点非移动DSP莫属。各个圈子都在纷纷谈论,认为移动DSP是行业突破点,一时间许多移动广 告联盟风起云涌,竞相推出专属移动DSP产品。   到底什么是移动DSP呢?   DSP(Demand-SidePlatform),就是需求方平台,为解决广 告主投放的各种需求,真正实现人群定位的精准广 </div> </li> <li><a href="/article/1053.htm" title="myelipse设置" target="_blank">myelipse设置</a> <span class="text-muted">alafqq</span> <a class="tag" taget="_blank" href="/search/IP/1.htm">IP</a> <div>  在一个项目的完整的生命周期中,其维护费用,往往是其开发费用的数倍。因此项目的可维护性、可复用性是衡量一个项目好坏的关键。而注释则是可维护性中必不可少的一环。 注释模板导入步骤  安装方法: 打开eclipse/myeclipse 选择 window-->Preferences-->JAVA-->Code-->Code </div> </li> <li><a href="/article/1180.htm" title="java数组" target="_blank">java数组</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/java%E6%95%B0%E7%BB%84/1.htm">java数组</a> <div>java数组的   声明  创建  初始化;   java支持C语言      数组中的每个数都有唯一的一个下标 一维数组的定义 声明: int[] a = new int[3];声明数组中有三个数int[3] int[] a 中有三个数,下标从0开始,可以同过for来遍历数组中的数 </div> </li> <li><a href="/article/1307.htm" title="javascript读取表单数据" target="_blank">javascript读取表单数据</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a> <div>利用javascript读取表单数据,可以利用以下三种方法获取: 1、通过表单ID属性:var a = document.getElementByIdx_x_x("id"); 2、通过表单名称属性:var b = document.getElementsByName("name"); 3、直接通过表单名字获取:var c = form.content.</div> </li> <li><a href="/article/1434.htm" title="探索JUnit4扩展:使用Theory" target="_blank">探索JUnit4扩展:使用Theory</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/JUnit/1.htm">JUnit</a><a class="tag" taget="_blank" href="/search/Theory/1.htm">Theory</a> <div>理论机制(Theory) 一.为什么要引用理论机制(Theory)         当今软件开发中,测试驱动开发(TDD — Test-driven development)越发流行。为什么 TDD 会如此流行呢?因为它确实拥有很多优点,它允许开发人员通过简单的例子来指定和表明他们代码的行为意图。 TDD 的优点:     &nb</div> </li> <li><a href="/article/1561.htm" title="[Spring Data Mongo一]Spring Mongo Template操作MongoDB" target="_blank">[Spring Data Mongo一]Spring Mongo Template操作MongoDB</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/template/1.htm">template</a> <div>什么是Spring Data Mongo Spring Data MongoDB项目对访问MongoDB的Java客户端API进行了封装,这种封装类似于Spring封装Hibernate和JDBC而提供的HibernateTemplate和JDBCTemplate,主要能力包括 1. 封装客户端跟MongoDB的链接管理 2. 文档-对象映射,通过注解:@Document(collectio</div> </li> <li><a href="/article/1688.htm" title="【Kafka八】Zookeeper上关于Kafka的配置信息" target="_blank">【Kafka八】Zookeeper上关于Kafka的配置信息</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/zookeeper/1.htm">zookeeper</a> <div>问题: 1. Kafka的哪些信息记录在Zookeeper中 2. Consumer Group消费的每个Partition的Offset信息存放在什么位置 3. Topic的每个Partition存放在哪个Broker上的信息存放在哪里 4. Producer跟Zookeeper究竟有没有关系?没有关系!!!   //consumers、config、brokers、cont</div> </li> <li><a href="/article/1815.htm" title="java OOM内存异常的四种类型及异常与解决方案" target="_blank">java OOM内存异常的四种类型及异常与解决方案</a> <span class="text-muted">ronin47</span> <a class="tag" taget="_blank" href="/search/java+OOM+%E5%86%85%E5%AD%98%E5%BC%82%E5%B8%B8/1.htm">java OOM 内存异常</a> <div>       OOM异常的四种类型:       一: StackOverflowError :通常因为递归函数引起(死递归,递归太深)。-Xss 128k 一般够用。        二: out Of memory: PermGen Space:通常是动态类大多,比如web 服务器自动更新部署时引起。-Xmx</div> </li> <li><a href="/article/1942.htm" title="java-实现链表反转-递归和非递归实现" target="_blank">java-实现链表反转-递归和非递归实现</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>20120422更新: 对链表中部分节点进行反转操作,这些节点相隔k个: 0->1->2->3->4->5->6->7->8->9 k=2 8->1->6->3->4->5->2->7->0->9 注意1 3 5 7 9 位置是不变的。 解法: 将链表拆成两部分: a.0-&</div> </li> <li><a href="/article/2069.htm" title="Netty源码学习-DelimiterBasedFrameDecoder" target="_blank">Netty源码学习-DelimiterBasedFrameDecoder</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/netty/1.htm">netty</a> <div> 看DelimiterBasedFrameDecoder的API,有举例: 接收到的ChannelBuffer如下: +--------------+ | ABC\nDEF\r\n | +--------------+ 经过DelimiterBasedFrameDecoder(Delimiters.lineDelimiter())之后,得到: +-----+----</div> </li> <li><a href="/article/2196.htm" title="linux的一些命令 -查看cc攻击-网口ip统计等" target="_blank">linux的一些命令 -查看cc攻击-网口ip统计等</a> <span class="text-muted">hotsunshine</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>Linux判断CC攻击命令详解 2011年12月23日 ⁄ 安全 ⁄ 暂无评论 查看所有80端口的连接数 netstat -nat|grep -i '80'|wc -l 对连接的IP按连接数量进行排序 netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n 查看TCP连接状态 n</div> </li> <li><a href="/article/2323.htm" title="Spring获取SessionFactory" target="_blank">Spring获取SessionFactory</a> <span class="text-muted">ctrain</span> <a class="tag" taget="_blank" href="/search/sessionFactory/1.htm">sessionFactory</a> <div> String sql = "select sysdate from dual"; WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext(); String[] names = wac.getBeanDefinitionNames(); for(int i=0; i&</div> </li> <li><a href="/article/2450.htm" title="Hive几种导出数据方式" target="_blank">Hive几种导出数据方式</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/hive/1.htm">hive</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%AF%BC%E5%87%BA/1.htm">数据导出</a> <div>Hive几种导出数据方式   1.拷贝文件   如果数据文件恰好是用户需要的格式,那么只需要拷贝文件或文件夹就可以。 hadoop fs –cp source_path target_path   2.导出到本地文件系统   --不能使用insert into local directory来导出数据,会报错 --只能使用</div> </li> <li><a href="/article/2577.htm" title="编程之美" target="_blank">编程之美</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B/1.htm">编程</a><a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a><a class="tag" taget="_blank" href="/search/%E9%87%8D%E6%9E%84/1.htm">重构</a> <div>我个人的 PHP 编程经验中,递归调用常常与静态变量使用。静态变量的含义可以参考 PHP 手册。希望下面的代码,会更有利于对递归以及静态变量的理解   header("Content-type: text/plain"); function static_function () { static $i = 0; if ($i++ < 1</div> </li> <li><a href="/article/2704.htm" title="Android保存用户名和密码" target="_blank">Android保存用户名和密码</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>转自:http://www.2cto.com/kf/201401/272336.html 我们不管在开发一个项目或者使用别人的项目,都有用户登录功能,为了让用户的体验效果更好,我们通常会做一个功能,叫做保存用户,这样做的目地就是为了让用户下一次再使用该程序不会重新输入用户名和密码,这里我使用3种方式来存储用户名和密码 1、通过普通 的txt文本存储 2、通过properties属性文件进行存</div> </li> <li><a href="/article/2831.htm" title="Oracle 复习笔记之同义词" target="_blank">Oracle 复习笔记之同义词</a> <span class="text-muted">eksliang</span> <a class="tag" taget="_blank" href="/search/Oracle+%E5%90%8C%E4%B9%89%E8%AF%8D/1.htm">Oracle 同义词</a><a class="tag" taget="_blank" href="/search/Oracle+synonym/1.htm">Oracle synonym</a> <div>转载请出自出处:http://eksliang.iteye.com/blog/2098861 1.什么是同义词       同义词是现有模式对象的一个别名。       概念性的东西,什么是模式呢?创建一个用户,就相应的创建了 一个模式。模式是指数据库对象,是对用户所创建的数据对象的总称。模式对象包括表、视图、索引、同义词、序列、过</div> </li> <li><a href="/article/2958.htm" title="Ajax案例" target="_blank">Ajax案例</a> <span class="text-muted">gongmeitao</span> <a class="tag" taget="_blank" href="/search/Ajax/1.htm">Ajax</a><a class="tag" taget="_blank" href="/search/jsp/1.htm">jsp</a> <div>数据库采用Sql Server2005 项目名称为:Ajax_Demo 1.com.demo.conn包 package com.demo.conn; import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException; //获取数据库连接的类public class DBConnec</div> </li> <li><a href="/article/3085.htm" title="ASP.NET中Request.RawUrl、Request.Url的区别" target="_blank">ASP.NET中Request.RawUrl、Request.Url的区别</a> <span class="text-muted">hvt</span> <a class="tag" taget="_blank" href="/search/.net/1.htm">.net</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/C%23/1.htm">C#</a><a class="tag" taget="_blank" href="/search/asp.net/1.htm">asp.net</a><a class="tag" taget="_blank" href="/search/hovertree/1.htm">hovertree</a> <div>  如果访问的地址是:http://h.keleyi.com/guestbook/addmessage.aspx?key=hovertree%3C&n=myslider#zonemenu那么Request.Url.ToString() 的值是:http://h.keleyi.com/guestbook/addmessage.aspx?key=hovertree<&</div> </li> <li><a href="/article/3212.htm" title="SVG 教程 (七)SVG 实例,SVG 参考手册" target="_blank">SVG 教程 (七)SVG 实例,SVG 参考手册</a> <span class="text-muted">天梯梦</span> <a class="tag" taget="_blank" href="/search/svg/1.htm">svg</a> <div>SVG 实例 在线实例 下面的例子是把SVG代码直接嵌入到HTML代码中。 谷歌Chrome,火狐,Internet Explorer9,和Safari都支持。 注意:下面的例子将不会在Opera运行,即使Opera支持SVG - 它也不支持SVG在HTML代码中直接使用。   SVG 实例 SVG基本形状 一个圆 矩形 不透明矩形 一个矩形不透明2 一个带圆角矩</div> </li> <li><a href="/article/3339.htm" title="事务管理" target="_blank">事务管理</a> <span class="text-muted">luyulong</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B/1.htm">编程</a><a class="tag" taget="_blank" href="/search/%E4%BA%8B%E5%8A%A1/1.htm">事务</a> <div>事物管理 spring事物的好处 为不同的事物API提供了一致的编程模型 支持声明式事务管理 提供比大多数事务API更简单更易于使用的编程式事务管理API 整合spring的各种数据访问抽象 TransactionDefinition 定义了事务策略 int getIsolationLevel()得到当前事务的隔离级别 READ_COMMITTED </div> </li> <li><a href="/article/3466.htm" title="基础数据结构和算法十一:Red-black binary search tree" target="_blank">基础数据结构和算法十一:Red-black binary search tree</a> <span class="text-muted">sunwinner</span> <a class="tag" taget="_blank" href="/search/Algorithm/1.htm">Algorithm</a><a class="tag" taget="_blank" href="/search/Red-black/1.htm">Red-black</a> <div>  The insertion algorithm for 2-3 trees just described is not difficult to understand; now, we will see that it is also not difficult to implement. We will consider a simple representation known</div> </li> <li><a href="/article/3593.htm" title="centos同步时间" target="_blank">centos同步时间</a> <span class="text-muted">stunizhengjia</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E9%9B%86%E7%BE%A4%E5%90%8C%E6%AD%A5%E6%97%B6%E9%97%B4/1.htm">集群同步时间</a> <div>做了集群,时间的同步就显得非常必要了。 以下是查到的如何做时间同步。 在CentOS 5不再区分客户端和服务器,只要配置了NTP,它就会提供NTP服务。 1)确认已经ntp程序包: # yum install ntp 2)配置时间源(默认就行,不需要修改) # vi /etc/ntp.conf server pool.ntp.o</div> </li> <li><a href="/article/3720.htm" title="ITeye 9月技术图书有奖试读获奖名单公布" target="_blank">ITeye 9月技术图书有奖试读获奖名单公布</a> <span class="text-muted">ITeye管理员</span> <a class="tag" taget="_blank" href="/search/ITeye/1.htm">ITeye</a> <div>ITeye携手博文视点举办的9月技术图书有奖试读活动已圆满结束,非常感谢广大用户对本次活动的关注与参与。 9月试读活动回顾:http://webmaster.iteye.com/blog/2118112本次技术图书试读活动的优秀奖获奖名单及相应作品如下(优秀文章有很多,但名额有限,没获奖并不代表不优秀):      《NFC:Arduino、Andro</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>