【问题标题】:Exact string coldfusion regular expression精确字符串coldfusion正则表达式
【发布时间】:2015-07-10 14:12:05
【问题描述】:

我正在使用正则表达式来替换所有不等于确切单词“NULL”的字符并保留所有数字。我做了第一步,将字符串中的所有“NULL”单词替换为:

<cfset data = ReReplaceNoCase("123NjyfjUghfLL|NULL|NULL|NULL","\bNULL\b","","ALL")>

它会删除确切的“NULL”单词的所有实例,这意味着它不会从子字符串“123NjyfjUghfLL”中删除字母“N”、“U”和“L”。这是正确的。但现在,我想扭转这种局面。我只想保留“NULL”字,这意味着它删除了单个“L”、“U”和“L”。所以我尝试了:

<cfset data = ReReplaceNoCase("123NjyfjUghfLL|NULL|NULL|NULL","[^\bNULL\b]","","ALL")>

但是现在它保留了所有的“N”、“U”和“L”字母,所以它输出“NULLNULLNULLNULL”。 “NULL”应该只有3次。

有人可以帮我解决这个问题吗?以及在哪里添加额外的代码来保留数字?谢谢。

【问题讨论】:

  • 我想出了这个:writeOutput(RereplaceNoCase(variables.a,"^((?!NULL).)*","","ALL")); 基于stackoverflow.com/questions/406230/…,但它仍然不是你想要的。一个很好的起点也许@adamcameron 可以提出一些建议。

标签: regex coldfusion


【解决方案1】:

你可以这样做

<cfset data = ReReplaceNoCase("123NjyfjUghfLL|NULL|NULL|NULL","(^|\|)(?!NULL(?:$|\|))([^|]*)(?=$|\|)","\1","ALL")>

(^|\|)(?!NULL(?:$|\|))([^|]*)(?=$|\|)

解释:

 (                   # Opens Capture Group 1
     ^               # Anchors to the beginning to the string.
 |                   # Alternation (CG1)
     \|              # Literal |
 )                   # Closes CG1
 (?!                 # Opens Negative Lookahead
     NULL            # Literal NULL
     (?:             # Opens Non-Capturing group
         $           # Anchors to the end to the string.
     |               # Alternation (NCG)
         \|          # Literal |
     )               # Closes NCG
 )                   # Closes NLA
 (                   # Opens Capture Group 2
     [^|]*           # Negated Character class (excludes the characters within)
                       # None of: |
                       # * repeats zero or more times
 )                   # Closes CG2
 (?=                 # Opens LA
     $               # Anchors to the end to the string.
 |                   # Alternation (LA)
     \|              # Literal |
 )                   # Closes LA

Regex101.com demo

最后,关于字符类的一些见解(方括号之间的内容)

[^\bNULL\b] 的意思是

 [^\bNULL\b]     # Negated Character class (excludes the characters within)
                   # None of: \b,N,U,L
                   # When \b is inside a character class, it matches a backspace character.
                   # Outside of a character class, \b matches a word boundary as you use it in your first code.

字符类不是为匹配或忽略单词而设计的,它们是为允许或排除字符或字符范围而设计的。

编辑:

好的,它运行良好。但是,如果我也想保留数字怎么办?我有点迷失在这行代码中,我找不到在哪里放置额外的代码......我认为额外的代码应该是 [^0-9] 对吗?

此正则表达式 (demo) 还允许任何长度的数字,其中数字是整个值

(^|\|)(?!(?:NULL|[0-9]+)(?:$|\|))([^|]*)(?=$|\|)

您还可以使用此正则表达式 (demo) 来允许具有十进制值的数字。

(^|\|)(?!(?:NULL|[0-9]+(?:\.[0-9]+)?)(?:$|\|))([^|]*)(?=$|\|)

【讨论】:

  • 好的,谢谢,我会尝试并给你我的反馈。
  • 好的,它运行良好。但是,如果我也想保留数字怎么办?我有点迷失在这行代码中,我找不到在哪里放置额外代码......我认为额外的代码应该是[^0-9] 对吧?
  • 用示例编辑您的原始问题,但这可能是您想要的(^|\|)(?!(?:NULL|[0-9]+)(?:$|\|))([^|]*)(?=$|\|)
  • 不幸的是,它对我不起作用,它输出的结果与给出的第一个答案相同。
  • @J-P-Dude 我打算添加示例,但我发布了一些可能的正则表达式作为编辑,并附有示例。希望对你有帮助。
猜你喜欢
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
  • 1970-01-01
  • 2017-06-12
  • 1970-01-01
  • 1970-01-01
  • 2012-08-18
相关资源
最近更新 更多