匹配未被某些字符包裹的模式

时间:2018-03-09 16:24:08

标签: java regex

我有一个像这样的输入字符串:

one `two three` four five `six` seven

其中一些部分可以用严重的重音字符(`)包裹。 我想仅匹配未被它包裹的这些部分,例如onefour fiveseven(跳过two threesix)。 我尝试使用前瞻((?<=)(?=))来执行此操作,但它识别four fivetwo threesix。是否有可能仅使用正则表达式解决此问题,或者我必须以编程方式执行此操作? (我正在使用java 1.8)

3 个答案:

答案 0 :(得分:1)

如果你确定没有未闭合的反叛,你可以这样做:

((?:\w| )+)(?=(?:[^`]*`[^`]*`)*[^`]*$)

这将匹配:

"one "
" four five "
" seven"

但它有点贵,因为检查线的剩余部分中的反复数量是否可被2整除的前瞻需要O(n^2)时间来扫描整个字符串。

请注意,无论空白位置在哪里,它都能正常工作,它实际上是反引号,它并不关心反引号的相对位置。如果你不需要这种强大的能力,那么@ anubhava的回答肯定会更高效。

演示:regex101

答案 1 :(得分:1)

您可以使用前瞻和后视来使用此正则表达式:

#define COMPUTE_LOOP_ITER 200000000

void compute()
{
    int p[2];
    for (int i = 0; i < COMPUTE_LOOP_ITER; ++i)
    {
        p[i%2] = i;
    }
}

void * thread_recv_message(void * arg)
{
    MPI_Comm comm = *(MPI_Comm*) arg;

    int flag;
    while (1)
    {
        MPI_Iprobe(1, 0, comm, &flag, MPI_STATUS_IGNORE);

        if (flag == 1) break;
        sleep(0);
    }

    MPI_Recv(NULL, 0, MPI_INT, 1, 0, comm, MPI_STATUS_IGNORE);

    return NULL;
}

// Returns the compute() time on p0, 0 on others
double test(MPI_Comm comm)
{
    int s, p;
    double res = 0;
    MPI_Comm_rank(comm, &s);
    MPI_Comm_size(comm, &p);

    if (p != 2)
    {
        fprintf(stderr, "Requires 2 processes and no more in comm\n");
        fflush(stderr);

        MPI_Abort(comm, 1);
    }

    // Pin each process to its own core
    int cpuid = sched_getcpu();
    cpu_set_t cpuset;
    CPU_ZERO(&cpuset);
    CPU_SET(cpuid, &cpuset);
    pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);

    if (s == 0)
    {
        pthread_t thr;
        pthread_attr_t attr;

        // Make sure the new thread is pinned on the same core
        pthread_attr_init(&attr);
        pthread_attr_setaffinity_np(&attr, sizeof(cpu_set_t), &cpuset);

        pthread_create(&thr, &attr, thread_recv_message, &comm);

        double t1,t2;
        t1 = MPI_Wtime();

        compute();

        t2 = MPI_Wtime();

        MPI_Barrier(comm);

        res = t2 - t1;
        pthread_join(thr, NULL);
    }
    else // s == 1
    {
        MPI_Barrier(comm);
        MPI_Send(NULL, 0, MPI_INT, 0, 0, comm);
    }

    MPI_Barrier(comm);

    return res;
}

RegEx Demo

<强>解释

(?<!`)\b\w+(?:\s+\w+)*\b(?!`)

答案 2 :(得分:-1)

我通过指定排除关闭字符(在你的情况下为空格)来解决这样的问题:

`[^\s]+`