正则表达式:匹配第一次出现的字符

时间:2010-01-06 13:18:46

标签: regex

我正在寻找一个匹配所有直到特定字符第一次出现的模式,比如“;” - 分号

我写了这个:

/^(.*);/

但它实际上匹配所有内容(包括分号),直到最后一次出现分号。

13 个答案:

答案 0 :(得分:406)

你需要

/[^;]*/

[^;]字符类,它匹配除分号之外的所有内容。

引用perlre联机帮助页:

  

您可以通过在[]中包含一个字符列表来指定字符类,该列表将匹配列表中的任何字符。如果“[”之后的第一个字符是“^”,则该类匹配列表中没有的任何字符。

这应该适用于大多数正则表达式方言。

答案 1 :(得分:241)

会;

/^(.*?);/

工作?

?是一个惰性运算符,因此在匹配;之前,正则表达式尽可能少地抓取。

答案 2 :(得分:32)

/^[^;]*/

[^;]表示匹配除分号之外的任何内容。方括号是一个集匹配运算符,它本质上匹配这组字符中的任何字符,开头的^使它成为反向匹配,因此匹配此集合中的任何

答案 3 :(得分:15)

尝试/[^;]*/

Google regex character classes了解详情。

答案 4 :(得分:10)

尝试/[^;]*/

这是否定character class

答案 5 :(得分:6)

示例文本:

"this is a test sentence; to prove this regex; that is g;iven below"

例如,如果我们上面有示例文本,那么正则表达式/(.*?\;)/会在第一次出现分号(;)之前为您提供所有内容,包括分号:"this is a test sentence;"

答案 6 :(得分:5)

这不是一个正则表达式解决方案,而是一个足够简单的问题描述。只需拆分你的字符串并从你的数组中获取第一项。

$str = "match everything until first ; blah ; blah end ";
$s = explode(";",$str,2);
print $s[0];

输出

$ php test.php
match everything until first

答案 7 :(得分:4)

这对我非常有帮助,因为我试图弄清楚如何匹配包含属性的xml标记中的所有字符。我遇到了“匹配一切到底”的问题:

/<simpleChoice.*>/

但是能够通过以下方式解决问题:

/<simpleChoice[^>]*>/

阅读这篇文章后。谢谢大家。

答案 8 :(得分:3)

"/^([^\/]*)\/$/"为我工作,只从数组中获取顶级“文件夹”,如:

a/   <- this
a/b/
c/   <- this
c/d/
/d/e/
f/   <- this

答案 9 :(得分:3)

真的很难过,没有人给你正确答案....

在正则表达式中,?让它不贪心。默认情况下,正则表达式将尽可能多地匹配(贪婪)

只需添加一个?并且它将是非贪婪的并尽可能少地匹配!

祝你好运,希望有所帮助。

答案 10 :(得分:2)

这将匹配每个字符串中的第一次出现,并忽略后续出现。

select calc.*
--select [day], CostCode, EmployeeID
--, CPr * DayEmpRT RegTime_old
, TotalTime - CPr * DayEmpOT RegTime
, CPr * DayEmpOT OverTime
from ( 
  select Agr.*
  --, round(EmpC1T / EmpT, 2) C1Pr
  --, round(1 - (EmpC1T / EmpT), 2) C2Pr
  , round(EmpCT / EmpT, 2) CPr
  , case when DayEmpT > 8 then 8 else DayEmpT end DayEmpRT
  , case when DayEmpT > 8 then DayEmpT - 8 else 0 end DayEmpOT
  from (
    select Totals.*
    , SUM(TotalTime) over (partition by EmployeeID, [day]) DayEmpT
    --, SUM(case when CostCode = 1 then TotalTime end) over (partition by EmployeeID) EmpC1T
    , SUM(TotalTime) over (partition by EmployeeID, CostCode) EmpCT
    , SUM(TotalTime) over (partition by EmployeeID) EmpT
    from Totals
    WHERE EmployeeID = '1234' ) Agr ) calc
order by 1,2,3

答案 11 :(得分:1)

没有对我有用。 (例如在记事本++中) 但是

^.*?(?=\;)

没有。

答案 12 :(得分:-1)

我发现

/^[^,]*,/

效果很好。

','是此处的“定界符”。