คำถามนี้ไม่ง่ายอย่างที่ผู้โพสต์คนอื่น ๆ ทำออกมา (และอย่างที่ฉันเคยเชื่อมา แต่เดิม) - เพราะคำถามนั้นไม่ได้มีความแม่นยำเท่าที่ควร
มีความแตกต่างระหว่าง "ช่องว่าง" และ "ช่องว่าง" หากคุณเพียงหมายถึงช่องว่างแล้วคุณควรใช้ regex " {2,}"
ของ หากคุณหมายถึงช่องว่างใด ๆนั่นเป็นเรื่องที่แตกต่างออกไป ช่องว่างทั้งหมดควรเปลี่ยนเป็นช่องว่างหรือไม่? จะเกิดอะไรขึ้นกับช่องว่างในตอนเริ่มต้นและจุดสิ้นสุด?
สำหรับเกณฑ์มาตรฐานด้านล่างฉันสันนิษฐานว่าคุณสนใจเฉพาะช่องว่างและคุณไม่ต้องการทำอะไรกับช่องว่างเดียวแม้ในช่วงเริ่มต้นและจุดสิ้นสุด
โปรดทราบว่าความถูกต้องนั้นสำคัญกว่าประสิทธิภาพเกือบตลอดเวลา ข้อเท็จจริงที่ว่าโซลูชัน Split / Join ลบช่องว่างที่นำหน้า / ต่อท้าย (แม้แต่ช่องว่างเดียว) นั้นไม่ถูกต้องเท่าที่ข้อกำหนดที่คุณระบุไว้ (ซึ่งแน่นอนว่าอาจไม่สมบูรณ์)
การใช้มาตรฐานMiniBench
using System;
using System.Text.RegularExpressions;
using MiniBench;
internal class Program
{
public static void Main(string[] args)
{
int size = int.Parse(args[0]);
int gapBetweenExtraSpaces = int.Parse(args[1]);
char[] chars = new char[size];
for (int i=0; i < size/2; i += 2)
{
// Make sure there actually *is* something to do
chars[i*2] = (i % gapBetweenExtraSpaces == 1) ? ' ' : 'x';
chars[i*2 + 1] = ' ';
}
// Just to make sure we don't have a \0 at the end
// for odd sizes
chars[chars.Length-1] = 'y';
string bigString = new string(chars);
// Assume that one form works :)
string normalized = NormalizeWithSplitAndJoin(bigString);
var suite = new TestSuite<string, string>("Normalize")
.Plus(NormalizeWithSplitAndJoin)
.Plus(NormalizeWithRegex)
.RunTests(bigString, normalized);
suite.Display(ResultColumns.All, suite.FindBest());
}
private static readonly Regex MultipleSpaces =
new Regex(@" {2,}", RegexOptions.Compiled);
static string NormalizeWithRegex(string input)
{
return MultipleSpaces.Replace(input, " ");
}
// Guessing as the post doesn't specify what to use
private static readonly char[] Whitespace =
new char[] { ' ' };
static string NormalizeWithSplitAndJoin(string input)
{
string[] split = input.Split
(Whitespace, StringSplitOptions.RemoveEmptyEntries);
return string.Join(" ", split);
}
}
การทดสอบบางส่วน:
c:\Users\Jon\Test>test 1000 50
============ Normalize ============
NormalizeWithSplitAndJoin 1159091 0:30.258 22.93
NormalizeWithRegex 26378882 0:30.025 1.00
c:\Users\Jon\Test>test 1000 5
============ Normalize ============
NormalizeWithSplitAndJoin 947540 0:30.013 1.07
NormalizeWithRegex 1003862 0:29.610 1.00
c:\Users\Jon\Test>test 1000 1001
============ Normalize ============
NormalizeWithSplitAndJoin 1156299 0:29.898 21.99
NormalizeWithRegex 23243802 0:27.335 1.00
ตัวเลขแรกคือจำนวนการทำซ้ำครั้งที่สองคือเวลาที่ใช้และตัวเลขที่สามคือคะแนนที่กำหนดโดย 1.0 จะดีที่สุด
นั่นแสดงให้เห็นว่าอย่างน้อยในบางกรณี (รวมถึงนิพจน์นี้) นิพจน์ทั่วไปสามารถทำงานได้ดีกว่าโซลูชัน Split / Join ซึ่งบางครั้งก็มีระยะขอบที่สำคัญมาก
อย่างไรก็ตามหากคุณเปลี่ยนเป็นข้อกำหนด "ช่องว่างทั้งหมด" การแบ่ง / เข้าร่วมจะปรากฏว่าชนะ บ่อยครั้งที่ปีศาจอยู่ในรายละเอียด ...