正则表达式问题

时间:2010-06-06 09:53:56

标签: regex

我有例子

Term:a=27 B=90 C=65

....我只希望价值CAC首先和A

我做了

(C=(\d+)^|A=(\d+))

但没有成功

为什么

3 个答案:

答案 0 :(得分:1)

通常,您不应该关心匹配参数的设置顺序,因为您可以在周围的代码中更改它们。要进行这种“正常”匹配,你需要这样的东西:

a=(\d+)\s+B=\d+\s+C=(\d+)

你的表达式正在寻找C =位或a =位:它不会同时匹配两者。另外,正如上面所指出的,“^”也无济于事。

我不知道在正则表达式引擎中切换匹配的任何简单方法。有趣地使用正面的后置(在C位匹配后寻找一点,但我不知道匹配变量的顺序在这种情况下是如此明确定义)可能是可能的,但它肯定是可以在周围的代码中。实现这一点的一种紧凑(丑陋且可能不安全)的方法是滥用像perl这样的eval函数来重写匹配变量的名称。这对我有用:

eval(s/a=(\d+) B=\d+ C=(\d+)/\$1=$2 \$2=$1/);
print "$1 \n"; #gives 65
print "$2 \n"; #gives 27

为了提供更具体的解决方案,我们需要了解有关正则表达式周围系统的更多信息。我怀疑任何'纯'正则表达式都是可移植的,或者是严格规则的。

答案 1 :(得分:1)

在你的正则表达式中你使用^符号,这表示字符串的开头,所以“c =(\ d +)^”将从不匹配,是不是试图匹配某些东西那是在字符串开头之前?

据我所知,正则表达式不能按照你想要的方式行事(就像在一个字符串中返回前两个值后面的两个值),然后使用两个单个表达式相当容易只需在前者(a)之前使用后者(C),如在伪代码中使用

match_for_a = "a=(\d+)"
match_for_c = "C=(\d+)"
do_something( match_for_c)
do_something( match_for_a)

你已经(几乎)每个

都有相应的正则表达式
a=(\d+)

C=(\d+)

编辑: 根据你的评论和我的回复,这里是一个函数返回一个元组的伪代码。

tuple match_c_and_a(){
  match_for_a = regex_match("a=(\d+)")
  match_for_c = regex_match("C=(\d+)")
  return (match_for_c, match_for_a)
}

但是这种事情并不是纯粹的正则表达式,而是依赖于编程语言。

再次编辑 我很抱歉,如果我错过了解你farka,但我在提交的任何答案中都看不到任何阻止你做你想做的事情。

你能做到吗

for every item in the database
   get the match for C
   do something with it
   get the match for a
   do something with it

正则表达式能够匹配字符串中的任何位置,因此无论您获得C项和A项的顺序都无关紧要。

答案 2 :(得分:0)

符合您需要的正则表达式是:

A=(\d+) B=\d+ C=(\d+)

但是你需要收集这样的输出(取决于你正在使用的工具或编程语言):

\2 \1

\2后跟\1,因为您希望首先是C的值,然后是A的值。这些数字反映了括号中的表达式在正则表达式中的顺序。

注意:我使用Notepad++的查找和替换工具验证了此表达式。