⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 regex.jam

📁 boost库提供标准的C++ API 配合dev c++使用,功能更加强大
💻 JAM
字号:
#  (C) Copyright David Abrahams 2001. Permission to copy, use, modify, sell and
#  distribute this software is granted provided this copyright notice appears in
#  all copies. This software is provided "as is" without express or implied
#  warranty, and with no claim as to its suitability for any purpose.

#
#   Returns a list of the following substrings:
#   1) from beginning till the first occurence of 'separator' or till the end,
#   2) between each occurence of 'separator' and the next occurence,
#   3) from the last occurence of 'separator' till the end.
#   If no separator is present, the result will contain only one element.
#
rule split ( string separator )
{
    local result ;
    local s = $(string) ;

    # Break pieaces off 's' until it has no separators left.
    local match = 1 ;
    while $(match)
    {
        match = [ MATCH ^(.*)($(separator))(.*) : $(s) ] ;
        if $(match) {
            match += "" ; # in case 3rd item was empty - works around MATCH bug
            result = $(match[3]) $(result) ;
            s = $(match[1]) ;
        }
    }
    # Combine the remaining part at the beginning, which does not have
    # separators, with the pieces broken off.
    # Note that rule's signature does not allow initial s to be empty.
    return $(s) $(result) ;
}

# Match string against pattern, and return the elements indicated by
# indices.
rule match ( pattern : string : indices * )
{
    indices ?= 1 2 3 4 5 6 7 8 9 ;
    local x = [ MATCH $(pattern) : $(string) ] ;
    return $(x[$(indices)]) ;
}

# Matches all elements of 'list' agains the 'pattern' 
# and returns a list of first paranthethised groups of 
# all successfull matches. 
rule transform ( list * : pattern )
{
    local result ;
    for local e in $(list)
    {
        local m = [ MATCH $(pattern) : $(e) ] ;
        if $(m)
        {
            result += $(m[1]) ;
        }        
    }
    return $(result) ;
}
NATIVE_RULE regex : transform ;

# Escapes all of the characters in symbols using the escape symbol
# escape-symbol for the given string, and returns the escaped string
rule escape ( string : symbols : escape-symbol )
{
  local result = "" ;
  local m = 1 ;
  while $(m)
  {
    m = [ MATCH ^([^$(symbols)]*)([$(symbols)])(.*) : $(string) ] ;
    if $(m)
    {
      m += "" ;  # Supposedly a bug fix; borrowed from regex.split
      result = "$(result)$(m[1])$(escape-symbol)$(m[2])" ;
      string = $(m[3]) ;
    }
  }
  string ?= "" ;
  result = "$(result)$(string)" ;
  return $(result) ;
}

# Replaces occurances of a match string in a given string. Returns the
# new string. The match string can be a regex expression.
#
rule replace (
    string # The string to modify.
    match # The characters to replace.
    replacement # The string to replace with.
    )
{
    local result = "" ;
    local parts = 1 ;
    while $(parts)
    {
        parts = [ MATCH ^(.*)($(match))(.*) : $(string) ] ;
        if $(parts)
        {
            parts += "" ;
            result = "$(replacement)$(parts[3])$(result)" ;
            string = $(parts[1]) ;
        }
    }
    string ?= "" ;
    result = "$(string)$(result)" ;
    return $(result) ;
}

rule __test__ ( )
{
    import assert ;

    assert.result a b c : split "a/b/c" / ;
    assert.result "" a b c : split "/a/b/c" / ;
    assert.result "" "" a b c : split "//a/b/c" / ;
    assert.result "" a "" b c : split "/a//b/c" / ;
    assert.result "" a "" b c "" : split "/a//b/c/" / ;
    assert.result "" a "" b c "" "" : split "/a//b/c//" / ;
    
    assert.result a c b d
      : match (.)(.)(.)(.) : abcd : 1 3 2 4 ;
    
    assert.result a b c d
      : match (.)(.)(.)(.) : abcd ;
    
    assert.result ababab cddc
      : match ((ab)*)([cd]+) : abababcddc : 1 3 ;

    assert.result a.h c.h 
      : transform <a.h> \"b.h\" <c.h> :  <(.*)> ;

    assert.result "^<?xml version=\"1.0\"^>"
      : escape "<?xml version=\"1.0\">" : "&|()<>^" : "^" ;
    
    assert.result "<?xml version=\\\"1.0\\\">"
      : escape "<?xml version=\"1.0\">" : "\\\"" : "\\" ;
    
    assert.result "string&nbsp;string&nbsp;" : replace "string string " " " "&nbsp;" ;
    assert.result "&nbsp;string&nbsp;string" : replace " string string" " " "&nbsp;" ;
    assert.result "string&nbsp;&nbsp;string" : replace "string  string" " " "&nbsp;" ;
    assert.result "-" : replace "&" "&" "-" ;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -