regex regular - 匹配空格但不包含換行符




expression (6)

下面的正則表達式會匹配空格,但不匹配換行符。

(?:(?!\n)\s)

DEMO

如果你想添加回車符,然後用\r添加\r 運營商在負向預測之內。

(?:(?![\n\r])\s)

DEMO

在非捕獲組之後添加+以匹配一個或多個空格。

(?:(?![\n\r])\s)+

DEMO

我不知道你們為什麼沒有提到與任何水平空格( 空格和製表符 )匹配的POSIX字符類[[:blank:]] 。 這個POSIX字符類可以用於BRE( 基本實型表達式 ),ERE( 擴展正則表達式 ),PCRE( Perl兼容正則表達式 )。

DEMO

我有時想匹配空白而不是換行符。

到目前為止,我一直在訴諸於[ \t] 。 有沒有一個尷尬的方式?


m/ /g只是給/ /空間,它會起作用。 或者使用\S - 它會替換所有特殊字符,如製表符,換行符,空格等等。


格雷格的回答中的變體也包括回車:

/[^\S\r\n]/

這個正則表達式比/[^\S\n]/沒有\r更安全。 我的推理是Windows使用\r\n換行符,Mac OS 9使用\r 。 你現在不可能在\n沒有找到\r \n ,但如果你確實找到了它,那麼它就不會意味著任何東西,只不過是換行符。 因此,由於\r可以表示一個換行符,我們也應該排除它。


你在找什麼是POSIX blank字符類。 在Perl中它被引用為:

[[:blank:]]

在Java中(不要忘記啟用UNICODE_CHARACTER_CLASS ):

\p{Blank}

與類似的\h相比,POSIX blank支持更多的正則表達式引擎( reference )。 一個主要的好處是它的定義在Unicode正則表達式的附錄C:兼容性屬性和所有支持Unicode的正則表達式風格的標準中得到修復。 (例如,在Perl中, \h選擇另外包含MONGOLIAN VOWEL SEPARATOR )。然而,支持\h的論點是它總是檢測Unicode字符(即使引擎不同意哪個),而POSIX字符類通常默認只有ASCII(如在Java中)。

但問題是,即使堅持Unicode也不能解決問題100%。 考慮以下在Unicode中不被認為是空白的字符:

前面提到的蒙古元音分隔符不包括在內,可能是一個很好的理由。 它與200C和200D一起出現在單詞(AFAIK)中,因此打破了所有其他空白符合的基本規則:您可以用它來標記化。 他們更像修飾語。 但是, ZERO WIDTH SPACEWORD JOINERZERO WIDTH NON-BREAKING SPACE (如果它不是字節順序標記)適用於我的書中的空白規則。 因此,我將它們包含在我的水平空白字符類中。

在Java中:

static public final String HORIZONTAL_WHITESPACE = "[\\p{Blank}\\u200B\\u2060\\uFFEF]"

使用雙重否定:

/[^\S\n]/

為了避免在perlport中關於\r\n映射提出的平台差異:

/[^\S\x0a\x0d]/

也就是說,不是非空白或非新行,以及排除CR和NL的模式類似。

De Morgan的法則分配外部不是( 在角色類中的補充),這相當於“空白而不是回車而不是換行”,但不要聽我說:

#! /usr/bin/env perl

use strict;
use warnings;

use 5.005;  # for qr//

my $ws_not_nl = qr/[^\S\x0a\x0d]/;

for (' ', '\f', '\t', '\r', '\n') {
  my $qq = qq["$_"];
  printf "%-4s => %s\n", $qq,
    (eval $qq) =~ $ws_not_nl ? "match" : "no match";
}

輸出:

" "  => match
"\f" => match
"\t" => match
"\r" => no match
"\n" => no match

請注意排除垂直選項卡,但這在v5.18中解決

這個技巧對於匹配字母字符也很方便。 請記住\w匹配“單詞字符”,字母字符,但也包含數字和下劃線。 我們醜陋的美國人有時想寫它,比如說,

if (/^[A-Za-z]+$/) { ... }

但是雙重否定的字符類可以尊重語言環境:

if (/^[^\W\d_]+$/) { ... }

這有點不透明,所以POSIX角色類可能會更好地表達意圖

if (/^[[:alpha:]]+$/) { ... }

或者按照szbalint建議

if (/^\p{Letter}+$/) { ... }

匹配其中沒有其他()字符 (如Text (abc(xyz 123) )的paretheings中的子串的模式是

\([^()]*\)

細節

刪除代碼段:

  • JavaScriptstring.replace(/\([^()]*\)/g, '')
  • PHPpreg_replace('~\([^()]*\)~', '', $string)
  • Perl$s =~ s/\([^()]*\)//g
  • Pythonre.sub(r'\([^()]*\)', '', s)
  • C#Regex.Replace(str, @"\([^()]*\)", string.Empty)
  • Regex.Replace(str, "\([^()]*\)", "")
  • Javas.replaceAll("\\([^()]*\\)", "")
  • Rubys.gsub(/\([^()]*\)/, '')
  • Rgsub("\\([^()]*\\)", "", x)
  • Luastring.gsub(s, "%([^()]*%)", "")
  • Bash / sedsed 's/([^()]*)//g'
  • Tclregsub -all {\([^()]*\)} $s "" result
  • C ++ std::regexstd::regex_replace(s, std::regex(R"(\([^()]*\))"), "")
  • Objective-C
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\([^()]*\\)" options:NSRegularExpressionCaseInsensitive error:&error]; NSString *modifiedString = [regex stringByReplacingMatchesInString:string options:0 range:NSMakeRange(0, [string length]) withTemplate:@""];




regex perl