如何在正则表达式中定义最接近的匹配?

时间:2017-01-21 09:58:22

标签: php regex

这是我的字符串:

"%ProgramFiles(x86)%\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.2 Tools\gacutil" /i "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\130\Microsoft.SqlServer.TransactSql.ScriptDom.dll

这是我的模式:

$str = "somethingtestsomethingtestsomething123something
        somethingtestsomethingtestsomething123something
        somethingtestsomethingtestsomething123something
        somethingtestsomethingtestsomething123something";

Demo

当前结果: /test.*?123/ testsomethingtestsomething123等于$1

预期结果: somethingtestsomethingtestsomething123等于$1

如您所见,我希望匹配最近的somethingtest123之间的所有内容。我怎么能这样做?

1 个答案:

答案 0 :(得分:2)

懒惰的量词并不一定能给你最短的匹配 - 只有最短的匹配从匹配的字符串中最左边的位置开始。

您需要使用negative lookahead assertion来确保所有分隔符都不属于"之间的"文本:

#ifndef LIST_H
#define LIST_H

template <typename ListType> class List{
public:

    enum ListPosition{LIST_START=-2,LIST_END=-1};
    enum Order{ASCENDANT,DESCENDANT};

    template  <typename NodeType> class ListNode{

        public:

            ListNode(const NodeType &value,const ListNode<NodeType>*const pElement, const ListNode<NodeType>*const nElement);
            ~ListNode();

            ListNode<NodeType> *const previous() const;
            ListNode<NodeType> *const next() const;

            void setPrevious(const ListNode<NodeType> *const pElement);
            void setNext(const ListNode<NodeType> *const nElement);
            void setValue(const NodeType& value);

        private:

            ListNode<NodeType> *pElement;
            ListNode<NodeType> *nElement;
            NodeType *value;
    };

    List();
    List(const List<ListType> &list);
    ~List();

    bool contains(const ListType& value) const;

    ListType& get(const int pos) const;
    ListNode<ListType>& getNode(const int pos) const;

    void add(const ListType& value);
    void add(const int pos, const ListType& value);
    void addAll(const int pos, const List<ListType>& list);
    void set(const int pos, const ListType& value);
    void remove(const int pos);
    void remove(const ListType& value);

    void order(Order order);

    int size() const;

    bool operator==(const List<ListType>& list) const;
    void operator=(const List<ListType>& list);
    operator const char *() const;
    ListType& operator[](const int pos) const;
    const ListNode<ListType>& operator[](const ListType& value) const;

protected:

    ListNode<ListType> *firstNode;
    ListNode<ListType> *lastNode;

    int _size;
};

#include "ListCode.h"
#include "ListNodeCode.h"
#endif