Regex: Chcete-li vytáhnout sub-string mezi dvěma značkami v řetězci

hlasů
42

Mám soubor v následujícím formátu:

Data Data
Data
[Start]
Data Chci
[Konec]
Data

Chtěl bych upoutat Data I wantz prostoru mezi [Start]a [End]štítky s použitím Regex. Může mi někdo ukázat, jak by to mohlo být provedeno?

Položena 04/08/2008 v 14:47
zdroj uživatelem
V jiných jazycích...                            


9 odpovědí

hlasů
63
\[start\](.*?)\[end\]

Zhich'll umístit text ve středu v zajetí.

Odpovězeno 04/08/2008 v 14:52
zdroj uživatelem

hlasů
22

\[start\]\s*(((?!\[start\]|\[end\]).)+)\s*\[end\]

To by mělo snad drop [start]a [end]značky stejně.

Odpovězeno 04/08/2008 v 14:55
zdroj uživatelem

hlasů
5
$text ="Data Data Data start Data i want end Data";
($content) = $text =~ m/ start (.*) end /;
print $content;

Měl jsem podobný problém na chvíli a mohu vám říci, tato metoda funguje ...

Odpovězeno 06/10/2012 v 17:52
zdroj uživatelem

hlasů
4

I když můžete použít regulární výraz analyzovat data mezi otevírací a uzavírací tagy, budete muset dlouho a tvrdě přemýšlet o tom, zda se jedná o cesta, kterou chceme jít dolů. Důvodem pro to je potenciál značek do hnízda: pokud hnízdění tagy se nikdy nestane nebo se může někdy stalo, jazyk je řekl, aby již neměla být pravidelná a regulární výrazy přestanou být správný nástroj pro rozebrat to.

Mnoho regulárních výrazů implementace, například PCRE nebo regulárních výrazů Perl, podpora ústupu, které lze použít k dosažení tohoto hrubého efektu. Ale PCRE (na rozdíl od Perl) nepodporuje neomezené ústupek, a to může skutečně způsobit věci rozbít v podivné způsoby, jakmile máte příliš mnoho značek.

Je tu velmi často citovaný příspěvek na blogu, který popisuje tento více http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html (google pro něj a kontrolovat cache v současné době se zdá, že má nějaké prostoje)

Odpovězeno 15/09/2008 v 15:18
zdroj uživatelem

hlasů
4

Podrobnější pojednání o úskalí pomocí regex najít odpovídající značky lze nalézt na adrese: http://faq.perl.org/perlfaq4.html#How_do_I_find_matchi . Zejména si uvědomit, že hnízdění tagy skutečně potřebují plnohodnotné parser, aby mohly být správně interpretovány.

Všimněte si, že citlivost případ bude muset být vypnuta, aby se odpovědět na otázku, jak je uvedeno. Perl, to je i modifikátor:

$ echo "Data Data Data [Start] Data i want [End] Data" \
  | perl -ne '/\[start\](.*?)\[end\]/i; print "$1\n"'
 Data i want 

Druhý trik je použít *? quantifier který vypne nenasytnost zachyceného utkání. Například, pokud máte non-odpovídající [end] tag:

Data Data [Start] Data i want [End] Data [end]

pravděpodobně nebudete chtít zachytit:

 Data i want [End] Data
Odpovězeno 20/08/2008 v 20:14
zdroj uživatelem

hlasů
3

No, pokud máte zaručeno, že každý počáteční značka je následována koncovou značku pak vkládá bude fungovat.

\[start\](.*?)\[end\]

Pokud však máte složitý text, jako je follwoing:

[start] sometext [start] sometext2 [end] sometext [end]

pak byste narazit na problémy s regex.

Nyní tento příklad bude vytáhnout všechny horké odkazy do stránky:

'/<a(.*?)a>/i'

Ve výše uvedeném případě, můžeme zaručit, že by neměly být žádné vnořené případy:

'<a></a>'

Tak, to je složitá otázka a nemůže být jen vyřešit pomocí jednoduchého odpověď.

Odpovězeno 11/05/2009 v 21:08
zdroj uživatelem

hlasů
1

Perl můžete obklopit data, která chcete s () 's a vytáhněte ji později, možná jiné jazyky mají podobnou funkci.

if ($s_output =~ /(data data data data START(data data data)END (data data)/) 
{
    $dataAllOfIt = $1;      # 1 full string
    $dataInMiddle = $2;     # 2 Middle Data
    $dataAtEnd = $3;        # 3 End Data
}
Odpovězeno 04/08/2008 v 15:00
zdroj uživatelem

hlasů
0

Čtení textu se v hranatých závorkách [] tedy [start] a [End] a ověřit pole se seznamem hodnot. jsfiddle http://jsfiddle.net/muralinarisetty/r4s4wxj4/1/

var mergeFields = ["[sitename]",
                   "[daystoholdquote]",
                   "[expires]",
                   "[firstname]",
                   "[lastname]",
                   "[sitephonenumber]",
                   "[hoh_firstname]",
                   "[hoh_lastname]"];       

var str = "fee [sitename] [firstname] \
sdfasd [lastname] ";
var res = validateMeargeFileds(str);
console.log(res);

function validateMeargeFileds(input) {
    var re = /\[\w+]/ig;
    var isValid;
    var myArray = input.match(re);

    try{
        if (myArray.length > 0) {
            myArray.forEach(function (field) {

                isValid = isMergeField(field);

                if (!isValid){
                   throw e;                        
                }
            });
        }
    }
    catch(e) {        
    }

    return isValid;
}

function isMergeField(mergefield) {
    return mergeFields.indexOf(mergefield.toLowerCase()) > -1;
}
Odpovězeno 12/09/2014 v 09:26
zdroj uživatelem

hlasů
0

Odkazovat na tuto otázku vytáhnout textu mezi tagy s mezerami a tečky ( .)

[\S\s] je ten jsem použil

Regex, aby odpovídala libovolné znaky včetně nových linek

Odpovězeno 28/08/2013 v 22:12
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more